Составной первичный ключ или один первичный ключ - PullRequest
2 голосов
/ 07 октября 2010

Лучше иметь один первичный ключ или использовать составные первичные ключи (обычно они представляют собой сочетание одного первичного ключа и внешних ключей). У меня есть примеры ниже:

Пример составного первичного ключа:

AMeta

--- AMetaId - первичный ключ
--- AMetaText

BMeta

--- BMetaId - первичный ключ
--- AMetaID - внешний ключ к таблице AMeta
--- BMetaText

A

--- AId - первичный ключ
--- AMetaId - первичный ключ и внешний ключ к таблице AMeta
--- ATExt

B

--- BId - первичный ключ
--- BMetaId - внешний ключ первичного ключа для таблицы BMeta
--- AId - первичный ключ и внешний ключ к таблице A
--- BText


Пример одного первичного ключа:

AMeta

--- AMetaId - первичный ключ
--- AMetaText

BMeta

--- BMetaId - первичный ключ
--- AMetaId - внешний ключ к таблице AMeta
--- BMetaText

A

--- AId - первичный ключ
--- AMetaId - внешний ключ к таблице AMeta
--- ATExt

B

--- BId - первичный ключ
--- BMetaId - внешний ключ к таблице BMeta
--- AId - внешний ключ к таблице A
--- BText

Какой дизайн базы данных лучше?

Ответы [ 2 ]

3 голосов
/ 07 октября 2010

Я обычно склонен использовать первичные ключи из одного столбца почти исключительно - либо имеется хороший естественный ключ (довольно редко), либо я добавляю в таблицу суррогатный ключ INT IDENTITY.

Мой основнойПричины:

  • первичный ключ должен быть уникальным, всегда ненулевым
  • первичный ключ - это ключ кластеризации в SQL Server по умолчанию, который добавляет стабильный (нес изменением), узкий (максимум 4 байта) и желательно постоянно увеличивающийся до списка критериев
  • с одним первичным ключом столбца, все мои внешние ключи также просты в использовании отдельных столбцов - я ненапример, чтобы объединить две таблицы в 3, 5 или более столбцах, чтобы объединение работало, это именно то, что происходит, если у вас есть составной первичный ключ
2 голосов
/ 07 октября 2010

Первая схема не имеет смысла, поскольку подразумевает (и допускает), что в таблице B может быть несколько строк с одним и тем же значением BId, но с разными значениями AId, и нет никакого смысла, связанного со столбцом Bid.Это ФК куда-то еще?Если так, то к чему?Если нет, то что это генерирует?Что это значит?

Вторая схема, с другой стороны, логически последовательна, но подразумевает, что строки в таблице B могут быть связаны с двумя различными строками в таблице AMeta,

  1. через таблицу B с использованием столбца FK BMetaId и оттуда до таблицы AMeta с использованием TableB.AMetaId, а также
  2. через таблицу BMeta с использованием столбца BMetaId в таблицу BMeta и оттуда в AMeta с использованием BMEta.AMetaId

Действительно ли это точное представление о модели вашего бизнеса?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...