супертип / подтип базы данных - PullRequest
1 голос
/ 11 октября 2011

Мне нужно создать базу данных для отслеживания местоположения посылки.

В принципе, может быть 4 местоположения: на самолете, на корабле, в машине, в транзитном офисе.

Мне нужно иметь отдельные объекты для этих 4 мест, потому что у них всех есть несколько экземпляров каждого (например, много самолетов, много автомобилей)

Кроме того, каждый из этих 4 объектов управляется одним и только одним сотрудником (другим объектом).

Я создал ассоциативную сущность под названием job, в которой хранится информация о том, какой сотрудник работает в каждом из 4 мест, аналогично номеру рейса, который содержит идентификатор самолета с идентификатором пилота.

Я изучил атрибуты 4 локаций и обнаружил, что их можно отнести к автомобилям, являющимся супертипом, а самолет, корабль и офис - подтипом автомобиля.

будет уникальный атрибут location_id, который сообщает мне, находится ли он в самолете или офисе в супертипе, поэтому подтип наследует этот атрибут.

Мой вопрос заключается в том, можно ли сделать это в схеме таблиц, поскольку местоположения будут разделены на четыре разные таблицы, когда бы я ни ссылался на location_id (FK) из объекта задания, поскольку внешний ключ обычно ссылается только на один таблица, а не 4 таблицы в этом случае ..

СОТРУДНИК [ employee_id , имя сотрудника, пол, номер контакта, job_scope]

JOB [ job_id , (employee_id), (location_id)] ​​* ​​1023 *

OFFICE [ location_id , office_id, адрес]

CAR [ location_id , vehicle_id]

САМОЛЕТ [ location_id , Vehicle_id, тип, без груза, вес]

КОРАБЛЬ [ location_id , vehicle_id, размер]

1 Ответ

1 голос
/ 11 октября 2011

Создать таблицу Местоположения.

Location-id
Location-Type
Description

(Примечание: второе поле является избыточным, потому что если Местоположением является «Корабль», вы найдете запись в таблице Кораблей и больше нигде, но может быть неплохо иметь)

Location-ID будет первичным ключом таблицы местоположений.И это будет внешний ключ для корабля, воздуха, офиса и т. Д.

Итак, давайте предположим, что вы хотите отобразить 2 «местоположения», одно - корабль, другое - офис.

Таблица местоположения:

Location-Id | Location-Type | Description
      ...   | ...           | ... 
     005768 | Ship          | "The Sea Witch" Mexican Cargo
      ...   | ...           | ...
     087956 | Office        | "Our offices in Albuquerque"

Стол в офисе

Office-Id | Address 
   ...    | ...
   087956 | "145 Rose St. Albuquerque"
   ...    | ...

Таблица доставки

  Ship-Id | Size 
   ...    | ...
   005768 | 14000
   ...    | ...

В случае, если вам удастся найти какое-то другое поле, которое существует для всех 4 типовиз "location" добавьте его в таблицу Location.

Остальное должно быть более или менее в порядке: ваша таблица Job будет указывать здесь, и каждый "конкретный" класс будет получен путем объединения записи Location с определеннымзапись «подтип».

Примечание. Если вы имели в виду «местоположение» как нечто иное, например, «географический район», такой как «Аризона» или «Мексиканский залив», вам придется добавить его в качестве атрибутаТаблица расположения.Для Office это будет статично, в то время как другие типы «местоположений» могут изменять его при перемещении.

Таким образом, супертипом является «Местоположение», а Office или Ship являются подтипами «общего» местоположения.

Это стандартный способ моделирования супертипов в RDBMS, кстати, как уже объяснялось в некоторых других местах .

...