Первый вариант самый гибкий.И я склонен идти с гибкостью.
Преимущество: общие запросы
Если вам нужен отчет о круизах, запрос такой же, как и для отелей, но с другим предложением WHERE.
Используя вторую форму, вам нужно присоединиться и выбрать из разных таблиц.
* Преимущество: рост без изменений схемы
Если вам нужно добавить экскурсии в вашу модель (то, что может определенно иметь много связанных содин пакет), вы просто создаете новый тип Экскурсий.
Используя вторую форму, вам нужно добавить новые поля в таблицы, создать новые таблицы для хранения данных и обновить запросы и логику, чтобы использовать эти новыетаблицы и поля.
Стоимость: перемещение данных в форму, не благоприятную для пищеварения человека
Многие люди могут на законных основаниях сказать, что это вообще не должно иметь значения.Я говорю, что это важно, поскольку вы должны учитывать это ...
- Это может усложнить отладку, поэтому вам нужно быть более регламентированным и методичным
- Это значит, что ваш графический интерфейс должен быть умнеев преобразовании ваших данных для отображения
Кроме того, хотя это и дорого, оно имеет преимущество, заключающееся в том, что вы становитесь посредником, когда вы менее вероятны, поэтому делайте упрощенные предположения и допускайте небрежные ошибки.Это цена, которую я хотел бы иметь.
Недопустимость: ограничения не могут быть применены
Ограничение - каждый компонент пакета должен быть либо Отель, Упаковка, Полет или Круиз
Метод - Есть таблица component_typeи FK для этой таблицы
Ограничение - для каждого пакета разрешен только один из каждого типа
Метод - УНИКАЛЬНОЕ ограничение для (package_id, component_type_id)
Ограничение - каждый компонент может быть только в пределах одногоМетод пакета - УНИКАЛЬНОЕ ограничение на (component_id)
Стоимость - отложенная сложность
На мой взгляд, нормализованная таблица для сопоставления пакетов с компонентами на самом деле проста и элегантна.Следующий шаг - решить, как сохранить связанные детали компонента.
Одна глобальная таблица «компонент» может содержать все поля, но позволяет им обнуляться.Таким образом, HOTEL будет иметь NULL Flight_Number.Но все компоненты будут иметь цену.
Или вы можете создать таблицу Entity_Attribute_Value.Это может быть сформировано таким образом, чтобы отели не имели номер рейса ...
- component_attributes table = (id, type_id, attribute_id, attribute_value)
- (type_id, attribute_id) может иметь внешний ключ для допустимогокомбинации
Невозможно (afaik) применить обязательные поля, такие как Price.
Значение часто сохраняется как VARCHAR.
По этой и другим причинам поиск данных по значению становится трудным,
окончательное мнение
Я бы не использовал вариант 2, поскольку он сильно ограничен и объединяет два соображения вместе - Как хранить данные для разныхтипы компонентов (отели, рейсы и т. д.) и как связать их с родительскими пакетами.
Вместо этого я бы порекомендовал вам рассмотреть множество способов хранения данных компонентов и принять это решение в зависимости от ваших потребностей.,Затем свяжите эти компоненты с пакетами, используя таблицу нормализованного отображения 1: много.Ваш вариант 1.