2010-08-19 4 views
0

Я прошел через ссылку:Составной первичный ключ вирши один столбец на основе первичного ключа

Database Design: Composite key vs one column primary key

Mine вопрос:

Для таблицы, которая никогда не может ссылаться как внешний ключ к любой другой таблице , что такое + ve/-ve аспект в процессе вставки/обновления с использованием первичного ключа на основе первичного ключа на основе столбцов с несколькими столбцами/составными столбцами?

Благодаря

ответ

3

Да, несколько столбцов первичного ключа все еще плохой выбор, если:

  • ваш первичный ключ является также кластеризация ключ
  • ваша таблица содержит также другие некластерный индексы

Потому что:

  • Значение (значения) из ключа кластеризации (например, одиночный столбец INT или ваш составной ключ) будет добавляться к каждой записи в каждом некластеризованном индексе

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

Помимо потери пространства, ваша производительность также будет отставать, поскольку большие индексы означают большее количество операций ввода-вывода диска для тех же операций.

В целом: использовать составной первичный ключ на столе только, если вы никогда не должны ссылаться на эту таблицу (на самом деле никогда, даже в будущем), и если у вас нет никаких других некластеризованных показателей по эта таблица.

+0

Вы указали некоторые причины, по которым не нужно иметь слишком большой кластерный индекс в SQL Server. Однако эти проблемы не связаны с первичными ключами. Кластеризованный индекс и ключ - это не одно и то же - даже в SQL Server. Кроме того, составной ключ может быть меньше, чем один ключ атрибута - так что размер сам по себе не является аргументом для избежания составных клавиш. – sqlvogel

+0

@dportas: строго говоря, вы правы. Но по крайней мере 90% первичных ключей на SQL-сервере также являются ключом кластеризации - в основном потому, что многие разработчики просто ничего не знают о кластеризации ключей, а их первичные ключи автоматически становятся их ключами кластеризации. –

+0

У меня есть таблица, основной (кластерный) ключ - это UserID и Timestamp для таблицы журналов. Я понял, что это нормально, потому что это индекс * только * index на клавиатуре. Он может генерировать суммы для одного пользователя быстро, потому что UserID является столбцом * first * в этом кластерном индексе (первичный ключ) и включает отметку времени в индексе, которая гарантирует ее уникальность. Это звучит хорошо? – Triynko

0

Бизнес-требования (требования к целостности данных) должны быть определяющим фактором в отношении того, какие ключи реализовать. Принудительная однозначность по одному признаку, очевидно, отличается от того, чтобы обеспечить его выполнение более чем одним, потому что дубликаты, которые разрешались бы в одном случае, не были бы разрешены в другом (если вы не реализуете как ключи, конечно).

Обратите внимание, что ответ marc применяется только к кластерным индексам, а не к первичным ключам. Это не одно и то же. Его ответ также специфичен для SQL Server.

+0

Да, мой ответ специфичен для SQL Server, и да, он применяется к ключам кластеризации - но по умолчанию ваши первичные ключи SQL Server ** ARE ** Клавишные ключи - если вы явно не отключите это - возможно, подавляющее большинство разработчиков выиграют 't do ..... –

+0

Дорогой ВСЕ, Я смущен из всех вышеперечисленных ответов. Если в моем случае составной ключ является первичным ключом, и он также будет иметь кластеризованные индексы, и эта таблица никогда не будет использоваться как FK, и нет другого некластеризованного индекса, тогда ват будет включать в себя вставку и обновление в этой таблице. Здесь уместно упомянуть, что в этой таблице будет огромное количество данных. – ibrar

+0

@ibrar: Да, конечно, есть удар. Цель такого ограничения заключается в том, чтобы предотвратить неправильные обновления или вставки. Очевидно, что при выполнении этой проверки есть накладные расходы, но если вы не хотите проверять уникальность, то вы вообще не будете применять ограничение. Поэтому, чтобы реализовать его на одном или нескольких столбцах, это не вопрос, связанный с производительностью - это зависит от того, чего вы хотите достичь. Я не знаю какой-либо общей разницы в производительности между одним или несколькими столбцами в индексах, но это может зависеть от многих вещей, поэтому я предлагаю вам проверить это самостоятельно. – sqlvogel

1

И как вы можете быть абсолютно уверены, что ваш ключ «никогда не может быть вызван FK»?

Ваша комбинация атрибутов действительно уникальна (иначе вы не стали бы рассматривать ее как «первичный ключ»).

Таким образом, ваша комбинация атрибутов является действительным средством идентификации для реального мира, которое описано в вашей таблице.

Сказать, что это никогда не может ссылаться на FK, равнозначно утверждению, что «никакая дополнительная информация об этом типе никогда не станет актуальной для бизнеса». Как вы можете это знать?

+0

Дорогой, спасибо за быстрый ответ, но я все еще придерживаюсь своего утверждения о том, что «никогда не ссылается на FK», потому что определенная таблица является самой низкой в ​​hirarchy из таблиц в моей базе данных. если и потребует, тогда я дам вам точный пример в моем случае. – ibrar

+0

Очень легко спроектировать его, чтобы никогда не ссылаться на FK, потому что по дизайну некоторые виды информации являются самодостаточными и окончательными. Например, таблица журналов с составным кластерным первичным ключом UserID, Timestamp уникальна и сначала группируется с UserID, поэтому отдельные пользовательские журналы могут быть быстро восстановлены с минимальным вводом-выводом. Причина, по которой другой таблице никогда не понадобится ссылаться на такую ​​запись/ключ журнала, заключается в том, что она является самодостаточной по дизайну. Другими словами, нет новой/внешней/дополнительной информации, которая когда-либо понадобилась бы для ссылки или добавления в эту строку в отдельной таблице. – Triynko

0

Существует две конкурирующие философии по этому вопросу.

Я твердо в лагере с использованием составных первичных ключей для определенных таблиц.

Когда я создаю базу данных, я использую моделирование ER для сбора требований к информации в одном месте. Каждое значение, которое будет обслуживаться базой данных, является экземпляром атрибута, и каждый атрибут описывает объект предмета или отношение между двумя или более предметами. Внешние ключи не входят в фазу анализа.

Прежде чем начать разработку базы данных, я решаю, как будет идентифицироваться каждый объект с точки зрения приложения. Это даст мне мои основные ключи. Каждая таблица, описывающая объект, будет иметь простой первичный ключ, идентификатор для объекта. Простые отношения (двоичные, много-к-одному) не нуждаются в собственной таблице. Каждая таблица, описывающая сложные отношения, будет иметь составной первичный ключ, состоящий из первичных ключей участвующих сущностей.

Внешние ключи подключаются очевидным образом. Ну, очевидно, для меня, по крайней мере. Это обеспечивает начальный дизайн таблицы в 3NF и, возможно, выше. Дизайн таблицы может быть изменен путем дальнейшей нормализации или другими шаблонами проектирования, несовместимыми с нормализацией (так называемая денормализация). Но это первый разрез в дизайне стола.

Эта практика проектирования приводит к различным результатам в отношении производительности и целостности данных, чем преобладающая практика. Преобладающая практика помещает столбец autonumber с именем «id» в качестве первого столбца каждой таблицы. Этот столбец становится основным ключом.

По существу, эта практика использует структуру таблиц SQL для имитации модели данных графа, даже если она похожа на реляционную модель. Столбец id является суррогатом для адреса строки. Графическая модель данных имеет потенциал роста и недостаток. Подробнее об этом, если потребуется.