Проектирование базы данных - выбор ключа для детей объединяемых таблиц
Я искал ответы на следующие вопросы, но получил ответы, в основном связанные с тем, следует ли вообще использовать суррогат, а не с тем, использовать ли затем составные ключи для дочерних элементов таблиц соединения.
У меня есть стол attendees
и стол events
,
Таблица соединения event_attendees
, содержащий два внешних ключа attendee_id
а также event_id
, а также имеет суррогатный первичный ключ id
скажем, участники мероприятия могут иметь schedule_items
,
Я обычно просто использовал бы столбцы event_attendee_id
, schedule_item_id
в таблице event_attendee_schedule_items
,
Какие недостатки, если таковые имеются, будет иметь использование следующего составного внешнего ключа над вышеуказанным?
attendee_id
, event_id
, schedule_item_id
(составной ключ вместо прямой ссылки на event_attendees
Таблица)?
1 ответ
Я бы порекомендовал первый подход, если:
стол
event_attendees
все еще требуется. Потому что, если у вас есть две таблицы соединенияevent_attendees
а такжеevent_attendee_schedule_items
(что в принципе и получается, если вы используете второй подход), вы можете вводить противоречивые данные. Даже если вы можете гарантировать, что две таблицы синхронизированы (например, с помощью внешней программы, которая записывает данные), я бы не стал этого делать.у вас есть идеи других расширений в том же стиле, как таблица
event_attendee_invoice_parts
(который будет ссылаться на данные счета) вы можете поместить общие данные вevent_attendees
event_attendees
имеет свои свойства, такие какentry_badge_id
который будет использоваться в контекстеevent_attendee_schedule_items
, По этим запросам вы должны присоединиться кevent_attendees
в любом случае.
Последняя причина дает нам дополнительную подсказку: это зависит от количества данных в таблицах и запросов, которые вы делаете! В некоторых случаях ваша производительность получит выгоду от составных ключей (и составных индексов), в других - нет. Смотрите этот вопрос для подробного обсуждения.