Каковы недостатки использования составного / составного первичного ключа? - PullRequest
15 голосов
/ 20 сентября 2008

Каковы недостатки использования составного / составного первичного ключа?

Ответы [ 8 ]

14 голосов
/ 20 сентября 2008
  1. Может вызвать больше проблем для нормализации ( 2NF , "". Обратите внимание, что когда таблица 1NF не имеет составных ключей-кандидатов (ключей-кандидатов, состоящих из более чем одного атрибута), таблица автоматически становится 2NF")
  2. Больше ненужного дублирования данных. Если ваш составной ключ состоит из 3 столбцов, вам необходимо создать 3 одинаковых столбца в каждой таблице, где он используется в качестве внешнего ключа.
  3. Как правило, этого можно избежать с помощью суррогатных ключей ( читайте об их преимуществах и недостатках )
  4. Я могу представить хороший сценарий для составного ключа - в таблице, представляющей отношение N: N, например «Студенты - классы», и ключ в промежуточной таблице будет (StudentID, ClassID). Но если вам нужно хранить больше информации о каждой паре (например, историю всех оценок ученика в классе), вы, вероятно, введете суррогатный ключ.
5 голосов
/ 20 сентября 2008

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

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

4 голосов
/ 20 сентября 2008

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

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

  • На глубокой схеме ключи могут получить довольно широко - я видел 8 столбцов один раз.

  • Изменения в значениях первичного ключа могут быть трудно идентифицировать в ETL загрузка процессов из системы. Пример, который у меня когда-то был см был MIS-приложение выписка из страховки система андеррайтинга. На некоторых случаи, когда политика входа будет повторно используется клиентом, меняется идентификатор политики. Это был часть первичного ключа Таблица. Когда это происходит нагрузка склада не в курсе что старое значение было таким, что оно не может совпадать новые данные к нему. Разработчик пришлось искать через аудит журналы для определения измененного значения.

Большинство проблем с несинтетическими первичными ключами связано с проблемами, когда значения PK записей изменяются. Наиболее полезные применения несинтетических значений - это когда схема базы данных предназначена для использования, например, M.I.S. приложение, в котором составители отчетов используют таблицы напрямую. В этом случае короткие значения с фиксированными доменами, такие как коды валют или даты, могут быть разумно размещены непосредственно в таблице для удобства.

1 голос
/ 18 мая 2009

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

Во-первых, подумайте, нужно ли вам вообще продвигать ключ: «само существование PRIMARY KEY в SQL кажется исторической случайностью какого-то рода. По мнению автора Криса Дейта, самые ранние воплощения SQL не делали этого». У него не было каких-либо ключевых ограничений, и PRIMARY KEY был добавлен только позже в стандарты SQL. Разработчики стандарта, очевидно, взяли термин от EFCodd, который изобрел его, хотя первоначальное представление Кодда к тому времени было заброшено! (Кодд первоначально предлагал что внешние ключи должны ссылаться только на один ключ - первичный ключ - но эта идея была забыта и проигнорирована, потому что она была широко признана как бессмысленное ограничение). " [источник: Блог Дэвида Портаса: долой первичные ключи?

Во-вторых, какие критерии вы бы применили, чтобы выбрать, какой ключ в таблице должен быть «основным»? В SQL выбор ключа PRIMARY KEY является произвольным и зависит от продукта. В ACE / Jet (он же MS Access) двумя основными и часто конкурирующими факторами является то, хотите ли вы использовать PRIMARY KEY для поддержки кластеризации на диске или хотите, чтобы столбцы, содержащие ключ, отображались жирным шрифтом на изображении «Отношения» в пользовательский интерфейс MS Access; Я в меньшинстве, думая, что стратегия индекса превосходит красивую картинку :) В SQL Server вы можете указать кластерный индекс независимо от PRIMARY KEY, и, похоже, преимущества для конкретного продукта не предоставляются. Единственное оставшееся преимущество, по-видимому, заключается в том, что вы можете опустить столбцы PRIMARY KEY при создании внешнего ключа в SQL DDL, что является поведением стандарта SQL-92 и в любом случае не кажется мне таким уж большим (возможно, другим одна из вещей, которые они добавили в стандарт, потому что эта функция уже широко распространена в продуктах SQL?) Итак, дело не в поиске недостатков, а в том, чтобы посмотреть, какое преимущество , если любой, ваш продукт SQL дает PRIMARY KEY. Другими словами, единственный недостаток при выборе неправильного ключа - то, что вы можете упустить данное преимущество.

В-третьих, вы скорее намекаете на использование искусственного / синтетического / суррогатного ключа для реализации в вашей физической модели ключа-кандидата из вашей логической модели, потому что вы обеспокоены тем, что если вы будете использовать естественный ключ в внешних ключах, то это приведет к снижению производительности стол включается? Это совершенно другой вопрос, и он во многом зависит от вашей «религиозной» позиции по вопросу о естественных ключах в SQL.

1 голос
/ 20 сентября 2008

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

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

0 голосов
/ 20 сентября 2008

Основным недостатком использования составного первичного ключа является то, что вы запутаете чертовски типичные генераторы кода ORM.

0 голосов
/ 20 сентября 2008
  1. когда вы видите его на диаграмме менее читабельным
  2. когда вы используете его при соединении запроса меньше читаемый
  3. когда вы используете его на клавиатуре Вы должны добавить проверочное ограничение обо всех атрибутах должно быть ноль или нет ноль (если только один ноль ключ не проверен)
  4. обычно требуется больше памяти при использовании в качестве внешнего ключа
  5. какой-то инструмент не управляет составным ключ
0 голосов
/ 20 сентября 2008

Нужно больше конкретики.

Слишком далеко, это может привести к чрезмерному усложнению вставок (каждый ключ ДОЛЖЕН существовать) и документации, и ваши объединенные чтения могут быть подозрительными, если не завершены.

Иногда это может указывать на некорректную модель данных (действительно ли составной ключ ДЕЙСТВИТЕЛЬНО описывает данные?)

Я не верю, что производительность снижается ... просто очень легко может пойти не так.

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