Составные ключи никогда не должны учитываться в «новых» приложениях.Они использовались в прошлом людьми, которые думали, что «бизнес-ключи» лучше, чем «суррогатные ключи».
Редактировать: По просьбе Криса я расширяю свой ответ.
Позвольте мне начать с того, что я понимаю этот вопрос как «Составные первичные ключи» против «Суррогатные ключи».
Кроме того, я допускаю, что существует один вариант использования, в котором имеет смысл составной ключ: в таблицах перекрестных ссылок, также называемых "таблицами ссылок".Они используются в таблицах «многие ко многим» и состоят только из двух полей, причем оба внешних ключа образуют первичный ключ для таблицы внешних ссылок.Например, таблица UserRole
будет содержать user_id
и role_id
, больше ничего.Например, в Java нет представления классов для такой таблицы.Обычно это @ManyToMany
, с Collection
с обеих сторон.
Я поделился своими взглядами на естественные ключи и суррогатные ключи в другом ответе ( Hibernate: мнения в Composite PK против суррогатных PK ), и я считаю, что у составных ключей есть некоторые недостаткиЕстественный ключ, не приносящий никакой реальной пользы.
Проблема с составными ключами заключается в том, что вам потребуется два значения для уникальной идентификации записи.Это становится проблемой, как только вы начинаете иметь таблицы, которые ссылаются на записи в этой первой таблице.Вторая таблица тогда нуждается в двух столбцах, чтобы иметь возможность ссылаться на одну запись.И если во второй таблице используется составной ключ, состоящий из одного значения + внешнего ключа, теперь у вас есть три столбца для уникальной идентификации одной записи.А для третьей таблицы понадобятся эти три дополнительных столбца просто для ссылки на одну запись во второй таблице.Действительно, это снежный ком.
Другим недостатком является то, что требования do меняются.Все время.То, что сегодня кажется хорошим составным ключом, вообще не является ключом завтра.Вот почему у нас есть суррогатные ключи: чтобы быть перспективным.
Составные ключи в основном используются для того, чтобы записи в таблице были уникальными на основе набора столбцов.Например, если у вас есть таблица Customers
, у вас может быть NationalId
+ Country
в качестве уникального значения, что означает, что два пользователя не могут использовать один и тот же SSN, если их страна - США.Но можно иметь один и тот же номер для двух записей, если они не находятся в одной стране.Если вам нравятся составные ключи, это будет хорошим кандидатом на это.Но, как я уже говорил, вы можете использовать суррогатный ключ и применить ограничение unique
.Вы получите преимущества составного ключа плюс безопасность суррогатного ключа.