Подтипирование таблиц базы данных - PullRequest
3 голосов
/ 15 апреля 2009

Я много слышал о таблицах подтипов при проектировании базы данных, и я полностью осознаю теорию, стоящую за ними. Тем не менее, я никогда не видел подтип таблицы в действии. Как вы можете создавать подтипы таблиц? Я использую MS Access и ищу способ сделать это как в SQL, так и через графический интерфейс (Access 2003).

Ура!

Ответы [ 5 ]

10 голосов
/ 15 апреля 2009

Простой пример: таблица Person с первичным ключом и несколько столбцов в этой таблице. Теперь вы можете создать другую таблицу с именем Student, которая имеет внешний ключ для таблицы person (ее супертип). Теперь в таблице учеников есть несколько столбцов, которых у супертипа нет, таких как GPA, Major и т. Д. Но имя, фамилия и тому подобное будут в родительской таблице. Вы всегда можете получить доступ к имени студента обратно в таблицу Person через внешний ключ в таблице Student.

В любом случае, просто запомните следующее:

  • Иерархия отображает отношения между супертипами и подтипами
  • Супертипы имеют общие атрибуты
  • Подтипы имеют уникальные атрибуты
1 голос
/ 25 февраля 2011

У меня похожая проблема, над которой я работал.

При поиске повторяемого шаблона я хотел убедиться, что не отказался от ссылочной целостности, а это означало, что я не буду использовать решение (TABLE_NAME, PK_ID).

Я наконец остановился на:

Таблица базовых типов: ЗАКАЗЧИК

Таблицы подтипов: PERSON, BUSINESS, GOVT_ENTITY

Я поместил пустые поля PRERSON_ID, BUSINESS_ID и GOVT_ENTITY_ID в CUSTOMER, с внешними ключами на каждом и проверочным ограничением, что только одно не является нулевым. Легко добавлять новые подтипы, просто нужно добавить внешний ключ, который может обнуляться, и изменить проверочное ограничение.

1 голос
/ 16 апреля 2009

Имейте в виду, что при разработке связанного приложения, как и в приложении Access, подтипы требуют больших затрат в плане объединений.

Например, если у вас есть таблица супертипа с тремя таблицами подтипов, и вам нужно отобразить все три в одной форме одновременно (и вам нужно показать не только дату супертипа), вы в конечном итоге выберете использование три внешних соединения и Nz (), или вам нужен UNION ALL из трех взаимоисключающих операторов SELECT (по одному для каждого подтипа). Ни один из них не будет редактируемым.

Я собирался вставить немного SQL из первого основного приложения, в котором я работал с таблицами супер / подтипов, но, глядя на него, SQL настолько сложен, что просто может сбить людей с толку. Это не так много, потому что мое приложение было сложным, но это потому, что природа проблемы сложна - представление полного набора данных пользователю, как супер-, так и подтипов, по своей природе является сложным. Мой вывод из работы с этим состоял в том, что мне было бы лучше только с одной таблицей подтипов.

Это не значит, что в некоторых случаях это бесполезно, просто связанные формы Access не обязательно облегчают представление этих данных пользователю.

1 голос
/ 15 апреля 2009

Понятие подтипов таблиц полезно при использовании преобразователя ORM для создания иерархии подтипов классов, которая точно моделирует домен.

Таблица подтипов будет иметь и внешний ключ обратно к своему родителю, который также является первичным ключом таблицы подтипов.

1 голос
/ 15 апреля 2009

Подтипы таблиц - это концептуальная вещь на диаграммах EER. Я не видел СУБД (исключая объектно-реляционные СУБД), которая бы поддерживала ее напрямую. Они обычно реализуются либо в

  1. Набор обнуляемых столбцов для каждого свойства подтипа в одной таблице
  2. С таблицей для свойств базового типа и некоторыми другими таблицами с не более чем одной строкой на базовую таблицу, которая будет содержать свойства подтипа
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...