Объяснение предпочтений суррогатного ключа

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

Однако либо я глуп, либо слеп, но я не вижу причин всегда иметь суррогатный ключ!

Допустим, у вас есть 3 таблицы в такой конфигурации: Link table

Зачем мне для этого нужен суррогатный ключ? Я имею в виду, что имеет смысл не иметь этого.

Кроме того, может кто-нибудь объяснить, почему первичные ключи никогда не должны меняться в соответствии с пуристами суррогатных ключей? Я имею в виду, если я сказал color_id VARCHAR(30), а ключ - black, и мне больше не нужен черный, потому что я меняю его на charcoal, почему это плохая идея менять black ключ на charcoal и все ссылающиеся столбцы тоже?

РЕДАКТИРОВАТЬ: только что заметил, что мне даже не нужно его менять! Просто создайте новый, измените столбцы ссылок (так же, как я сделал бы с суррогатным ключом) и оставьте старый в покое ...

В мантре суррогатного ключа мне нужно затем создать дополнительную запись, скажем, с id=232 и name=black. Какая от этого польза для меня на самом деле? У меня в столе есть запасной ключ, который мне больше не нужен. Также мне нужно присоединиться, чтобы получить название цвета, а иначе я могу остаться за одним столом и веселиться?

Пожалуйста, объясните, как пятилетнему ребенку, и имейте в виду, что я не пытаюсь сказать «суррогатный ключ - это плохо», я пытаюсь понять, почему кто-то говорит такие вещи, как «всегда используйте суррогатный ключ!».


person RandomWhiteTrash    schedule 13.05.2013    source источник
comment
Может быть, лучше подходит для programmers.stackexchange.com   -  person sloth    schedule 13.05.2013
comment
Хм ... Я думал, stackoverflow для программистов ...? Это не?   -  person RandomWhiteTrash    schedule 13.05.2013
comment
Он предназначен для программистов, но он предназначен для конкретных вопросов, на которые можно ответить, и вы, кажется, уже знаете, что на проблему суррогатного / несуррогатного материнства никогда нельзя будет ответить тем или иным способом к удовлетворению всех.   -  person Damien_The_Unbeliever    schedule 13.05.2013
comment
Что ж, это конкретные вопросы, на которые нужно ответить. Я хотел бы знать, зачем мне нужен суррогатный ключ для таблицы соединений и почему я не могу / не должен изменять первичный ключ. Меня не интересуют теоремы об абстрактных концепциях - я хочу получить некоторые ответы по этим двум конкретным вопросам, чтобы я мог судить для себя, есть ли у «экстремистов» какие-либо неопровержимые факты, подтверждающие их, или это просто вопрос «священной войны».   -  person RandomWhiteTrash    schedule 13.05.2013
comment
Это баланс, как и все в дизайне. В этом конкретном случае вам вероятно не нужен суррогатный ключ. Вот несколько плюсов и минусов суррогатных ключей, которые должны помочь вам принять оптимальное решение.   -  person Branko Dimitrijevic    schedule 14.05.2013


Ответы (3)


Суррогатные ключи полезны там, где есть неоптимальный естественный ключ: ни больше ни меньше. Субоптимальным естественным ключом может быть GUID или varchar или иным образом широкий / неупорядоченный.

Однако решение использовать суррогат - это решение реализации после процесса концептуального и логического моделирования, основанного на знании того, как работает выбранная СУБД.

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

Для таблицы ссылок (многие-многие) она вам не нужна: SQL: нужен ли вам автоинкрементный первичный ключ для таблиц" много-много "?. Для таблицы с 2 столбцами int накладные расходы составляют дополнительные 50% данных для суррогатного столбца (при условии int и игнорировании метаданных строки)

person gbn    schedule 13.05.2013
comment
Спасибо, голос разума среди безумия :). Приятно знать, что есть другие, кто согласен с тем, что «всегда» - не лучшая практика. Как вы говорите, все реализации должны быть адаптированы к реальному сценарию. - person RandomWhiteTrash; 13.05.2013
comment
Хороший ответ. Для таблиц ссылок накладные расходы еще хуже. Вы должны добавить уникальное ограничение для двух внешних ключей, удвоив накладные расходы на проверку ограничений. Если вы его опустите, ошибка программы может привести к появлению повторяющихся строк (кроме идентификатора) в таблице ссылок, что приведет к получению странных результатов при объединении. - person Walter Mitty; 25.05.2013

Ну я сам больше на натуральных ключах :)

Но суррогатные ключи могут иметь свои преимущества, даже если вы, как и я, хотите идти «натурально» до конца :)

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

Table Fee (
foreign_key1,
foreign_key2,
foreign_key3,
value)

запись определяется / идентифицируется тремя внешними ключами, но в то же время у вас может быть не более двух из них равными нулю. Таким образом, вы не можете создать их в качестве первичных ключей (вы просто поместите уникальный в 3 столбца). Чтобы иметь первичный ключ в этой таблице, единственный способ сделать это - использовать суррогат :)

Теперь ... почему бы не изменить первичный ключ ... Это можно считать довольно философским ... Я вижу это таким образом, надеюсь, что это будет иметь смысл ... Первичный ключ сам по себе - это не только комбинация of unique + not null, это больше о «реальной сути записи», о том, что она определяет запись в ядре. В этом смысле это не то, что вы могли бы легко изменить, не так ли?

Считайте себя примером. У вас есть ник, но он не определяет, кто вы на самом деле. Вы можете изменить это, но суть бытия собой не изменится. Теперь, если вы сохраните ник, но измените свою сущность ... будет ли это тот же человек? Нет, разумнее было бы считать его "новым" человеком ... И для пластинок то же самое ...

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

person Davide    schedule 13.05.2013
comment
Это потребует 4-го или 5-го решения нормальной формы, а не суррогатного ключа. - person gbn; 13.05.2013
comment
вот почему предложение должно быть определено, у меня не было особого выбора по этому поводу :( - person Davide; 13.05.2013

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

patient_name
address
mobile_no
email_address

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

Здесь вы можете написать суррогатный ключ поверх фактических данных.

patient_no----->primary key[surrogate key]
patient_name ---->pk
address
mobile_no--->pk
email_address
person siddartha kamble    schedule 05.06.2018