Использовать составные клавиши? Или всегда использовать суррогатные ключи?
Дубликат: Множество ко многим связям - Дизайн таблицы пересечений
Если у меня есть эти таблицы (* = первичный ключ):
user
id*
name
group
id*
name
Это лучше?
user_group
user_id*
group_id*
Или это лучше?
user_group
id*
user_id
group_id
Ответы
Ответ 1
Я всегда голосую за ключи, которые настолько узки, насколько это возможно, статические (никогда не меняются), и поэтому я обычно предпочитаю суррогатный INT как ключ над сложным ключом.
Если вы хотите ссылаться на составной ключ из другой таблицы, вам всегда нужно будет указать несколько условий, которые иногда могут быть довольно громоздкими!
Также проверьте некоторые из этих ссылок:
(конечно, другие, скорее всего, опубликуют не менее 10 ссылок PRO естественных ключей:-))
Нет никакого вреда в использовании суррогатного ключа - пойдите для этого!: -)
Марк
Ответ 2
Учитывая, что как user_id, так и group_id уже являются суррогатными ключами и, следовательно, гарантированно являются уникальными (при правильной реализации приложения), добавление третьего идентификатора является полностью избыточным.
Если вы не используете какой-либо ORM, который (к сожалению) обычно усложняет обработку составных клавиш. В этом случае вы должны оценить стоимость избыточности и простоту разработки с выбранным ORM.
Ответ 3
Всякий раз, когда я опускал суррогатный первичный ключ из таблицы соединений, я пришел, чтобы пожалеть об этом. Мне просто кажется, что когда я обойдусь, напишу код, чтобы управлять отношением, что суррогатный первичный ключ очень удобен. Я обычно следую за шаблоном Active Record и использую ASP.NET MVC, хотя ваш пробег может отличаться. В мире MVC наличие одного ключа ключа, который вы можете добавить в конец URL-адреса, очень выгодно.
Ответ 4
Я обычно рекомендую "искусственные ключи" (то, что вы называете "суррогатом" ), потому что, поскольку они практически бессмысленны вне БД, вы можете гарантировать, что им никогда не придется менять из-за внешних обстоятельств (в то время как все виды другие данные об объекте сущности могут).
Но ваша таблица user_group
, типичная "две внешние ключи и все", используемая для реализации отношения много: много, - это другой случай - два внешних ключа, о которых идет речь, так же под вашим контролем, как суррогатом было бы. Суррогатный ключ для не-сущности, т.е. Строки, которая существует только для представления немного отношения, в основном просто дедвейтом - я бы рекомендовал потерять ее.
Ответ 5
Первый пример достаточно. Даже если вы должны добавлять атрибуты в конструкцию таблицы "многие ко многим" (например, is_main_grp
и т.д.), Нет реальной потребности в суррогате в таблице ссылок, и вы, вероятно, всегда захотите установить уникальное ограничение на user_id
, group_id
в любом случае.
Только если вы должны были повесить еще несколько отношений "один-два" на связь (например, теги), THEN, я подумал бы о наличии суррогата в user_group
, и я бы не сделал этого, пока это не было требованием (поскольку суррогат относительно легко добавить):
user
id*
name
group
id*
name
user_group
id*
user_id
group_id
is_main_grp
user_group_tags
user_group_id*
tag_id*
tags
id*
tag_txt
Ответ 6
Я бы обычно согласился с Vinko, но если вы используете ORM, например Hibernate, это может быть более счастливое отношение (между вами и Hibernate), если вы дадите все суррогатное слово.