Лучшее описание этой темы я видел в книге Крейга Лармана «Применение UML и шаблонов», хотя он пишет не с базой данных, а с объектно-ориентированной точки зрения.
В реляционном мире есть 3 варианта (это основано на книге Лармана):
- подтип за вариант. Итак, вы создаете таблицу "order_flight" с
авиакомпания, выбор места и т. д., а также "order_train" с from_station,
to_station и т. д. Это делает таблицы красивыми и самоописываемыми, но
превращает ваш SQL в огромный беспорядок - он должен меняться для каждого подтипа.
- одна таблица со всеми возможными столбцами: в этом случае у вас есть одна таблица со всеми возможными полями для всех подтипов. Сюда,
ваш SQL остается намного проще - но таблица превращается в огромный беспорядок, и
вы зависите от своего клиентского приложения, чтобы «знать», что рейсы имеют
авиакомпании, но поезда нет.
- таблица общих атрибутов с подтипами, которые хранят свои уникальные значения в своих собственных таблицах. Это в основном то, что вы выбрали для
Дата; связь может быть установлена либо в таблице «заказ», либо в
таблица подклассов.
Каждый вариант имеет свои преимущества и недостатки - особенно в ситуации, когда вы заранее не знаете, какие подтипы вам понадобятся, первый вариант является самым простым в конце базы данных, но создает некоторую путаницу для код клиента.