Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Проектирование БД Новый топик    Ответить
 Первичный ключ (выделять отдельное поле или нет?)  [new]
Olegrik
Member

Откуда:
Сообщений: 18
Здравствуйте!
Подскажите, пожплуйста, стоит ли мне создавать отдельный поле под первичный ключ, если у меня в таблице есть поле, значения которого не будут нулевые и будут уникальные.
Насколько я понимаю, первичный ключ - это поле не нулевое и уникальное, которое дополнительно индексируется СУБД (может не всеми по-умолчанию).
Если конкретнее, то я говорю про таблицы devicetype, cartridgetype, stock, employee.
Например, в качестве первичного ключа для таблицы cartridge я выбрал sn (серийный номер), т.к. эти значения не могут быть нулевыми или дублироваться.

Как будет правильнее по теории и на практике.
Заранее благодарю!

PS. Индексируются ли автоматиччески поля с уникальными значениями в MySQL?

К сообщению приложен файл. Размер - 95Kb
3 июл 17, 05:42    [20607782]     Ответить | Цитировать Сообщить модератору
 Re: Первичный ключ (выделять отдельное поле или нет?)  [new]
vmag
Member

Откуда: г. Одинцово
Сообщений: 2639
Olegrik
Например, в качестве первичного ключа для таблицы cartridge я выбрал sn (серийный номер), т.к. эти значения не могут быть нулевыми или дублироваться.


У разных производителей серийные номера могут дублироваться, по крайней мере за обратное никто не утверждал...
Они могут гарантировано не повторяться, только если вы сами будете присваивать им свои собственные серийные номера...
Но в этом случае это будет все тот же обычный счетчик ключ, так зачем тогда городить огород, если можно пользоваться штатными счетчиками-ключами ?
3 июл 17, 08:35    [20607888]     Ответить | Цитировать Сообщить модератору
 Re: Первичный ключ (выделять отдельное поле или нет?)  [new]
mad_nazgul
Member

Откуда:
Сообщений: 4214
Olegrik,

Тема потенциально флеймовая.
Суррогатный ключ vs естественный ключ.

Решается в зависимости от конкретных бизнес-требований.
А так, в общем случае суррогатный ключ универсальнее, хотя не всегда удобнее.
3 июл 17, 09:08    [20607926]     Ответить | Цитировать Сообщить модератору
 Re: Первичный ключ (выделять отдельное поле или нет?)  [new]
Alibek B.
Member

Откуда:
Сообщений: 2430
Olegrik
Например, в качестве первичного ключа для таблицы cartridge я выбрал sn (серийный номер), т.к. эти значения не могут быть нулевыми или дублироваться.

Типичное заблуждение.
Для учета ТМЦ используйте суррогатный ключ (счетчик).
3 июл 17, 10:34    [20608157]     Ответить | Цитировать Сообщить модератору
 Re: Первичный ключ (выделять отдельное поле или нет?)  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 15943
Вообще-то назначение первичного ключа - это однозначная идентификация записи. Однако - с обязательным учётом следующих обстоятельств:

1) Значение поля первичного ключа записи должно быть уникально в пределах таблицы в течение всего срока жизни (внимание!!!) таблицы. Именно таблицы, а не записи! То есть удаление записи не "освобождает" значение первичного ключа этой записи для повторного использования.

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

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

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

Моя рекомендация - суррогатный ключ. И, если нужно, уникальный констрейнт (индекс) на содержательное поле.
3 июл 17, 12:38    [20608597]     Ответить | Цитировать Сообщить модератору
 Re: Первичный ключ (выделять отдельное поле или нет?)  [new]
schi
Member

Откуда: Москва
Сообщений: 2218
Если удобно использовать естественный ключ, надо использовать естественный ключ.

Правоверных развелось...
3 июл 17, 13:21    [20608764]     Ответить | Цитировать Сообщить модератору
 Re: Первичный ключ (выделять отдельное поле или нет?)  [new]
Olegrik
Member

Откуда:
Сообщений: 18
Спасибо всем большое!
Буду думать о суррогатных и естественных ключах - мой пробел в знаниях.
3 июл 17, 13:51    [20608928]     Ответить | Цитировать Сообщить модератору
 Re: Первичный ключ (выделять отдельное поле или нет?)  [new]
Alibek B.
Member

Откуда:
Сообщений: 2430
schi
Если удобно использовать естественный ключ, надо использовать естественный ключ.

В учете ТМЦ не бывает естественных ключей.
Для любого атрибута может возникнуть ситуация, когда он не указывается, изменяется или дублируется.
3 июл 17, 14:59    [20609262]     Ответить | Цитировать Сообщить модератору
 Re: Первичный ключ (выделять отдельное поле или нет?)  [new]
schi
Member

Откуда: Москва
Сообщений: 2218
Alibek B.
schi
Если удобно использовать естественный ключ, надо использовать естественный ключ.

В учете ТМЦ не бывает естественных ключей.
Для любого атрибута может возникнуть ситуация, когда он не указывается, изменяется или дублируется.


Какой ключ использовать - целиком и полностью зависит от задач, а не от советов гуру разного уровня.
3 июл 17, 15:32    [20609451]     Ответить | Цитировать Сообщить модератору
 Re: Первичный ключ (выделять отдельное поле или нет?)  [new]
Alibek B.
Member

Откуда:
Сообщений: 2430
schi
Какой ключ использовать - целиком и полностью зависит от задач, а не от советов гуру разного уровня.

Разумеется есть люди, которым нравится набивать собственные шишки, а затем их лелеять.
Но если таких склонностей нет, то лучше поверить на слово, что в складском учете и в учете ТМЦ естественных ключей не бывает.
3 июл 17, 15:43    [20609500]     Ответить | Цитировать Сообщить модератору
 Re: Первичный ключ (выделять отдельное поле или нет?)  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 15943
+
Если нет своего совета - нужно хотя бы охаять чужие...


schi, если человек не знает, какой ключ ему нужно использовать в его задаче - как он может узнать это без советов?
3 июл 17, 16:28    [20609722]     Ответить | Цитировать Сообщить модератору
 Re: Первичный ключ (выделять отдельное поле или нет?)  [new]
Cane Cat Fisher
Member

Откуда:
Сообщений: 1421
schi
Какой ключ использовать - целиком и полностью зависит от задач, а не от советов гуру разного уровня.


Да, это правда. Проблема лишь в том, что не существует задач, где было бы целесообразно использовать естественный ключ.
3 июл 17, 20:02    [20610458]     Ответить | Цитировать Сообщить модератору
 Re: Первичный ключ (выделять отдельное поле или нет?)  [new]
Кот Матроскин
Member

Откуда: Москва
Сообщений: 7579
Cane Cat Fisher
schi
Какой ключ использовать - целиком и полностью зависит от задач, а не от советов гуру разного уровня.


Да, это правда. Проблема лишь в том, что не существует задач, где было бы целесообразно использовать естественный ключ.


Ну, смотря что считать "естественным ключом". 2 ID в таблице "многие-ко многим" - это что?
Определенно не суррогат :)
3 июл 17, 20:54    [20610571]     Ответить | Цитировать Сообщить модератору
 Re: Первичный ключ (выделять отдельное поле или нет?)  [new]
mad_nazgul
Member

Откуда:
Сообщений: 4214
Так и знал, что будет флейм, флуд и содомия!
4 июл 17, 07:40    [20610929]     Ответить | Цитировать Сообщить модератору
 Re: Первичный ключ (выделять отдельное поле или нет?)  [new]
Cane Cat Fisher
Member

Откуда:
Сообщений: 1421
Кот Матроскин
Ну, смотря что считать "естественным ключом". 2 ID в таблице "многие-ко многим" - это что?
Определенно не суррогат :)


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

И потому здесь в общем случае необходимо третье поле - собственно суррогатный ID. Необходимость его станет очевидной, если представить себе, например, что записи участвуют в репликации, или какой-то системе проколирования "кто и когда это сделал".

Можно, конечно, заявить, что и с двумя идами из всего этого можно выкрутиться. Конечно, можно. Но это будут уверки вроде "а у меня в конторе первичный ключ - фамилия, и ничего, все работает уже месяц".
4 июл 17, 13:39    [20612117]     Ответить | Цитировать Сообщить модератору
 Re: Первичный ключ (выделять отдельное поле или нет?)  [new]
vadiminfo
Member

Откуда: Обнинск
Сообщений: 4663
"По теории", скорее всего, имена столбцов уникальны в БД. Действительно, теория реляционных БД предполагает, что они могут оказаться в одной таблице.
4 июл 17, 19:05    [20613475]     Ответить | Цитировать Сообщить модератору
 Re: Первичный ключ (выделять отдельное поле или нет?)  [new]
vadiminfo
Member

Откуда: Обнинск
Сообщений: 4663
"По теории", скорее всего, суррогатные ключи рассматривать не имеет смысла. Она (теория) как бы применяется на логическом уровне. Теория пытается помочь спроектировать оптимальную схему или показать, что этого сделать нельзя в данном случае и выбрать между альтернативами. После ее применения получится таблицы. А суррогатный ключ - имеет смысл именно для таблицы, а не сам по себе. Тогда как естественный имеет смысл в предметной области.

Суррогатные ключи имеют некие преимущества в нынешней так сказать реализации СУБД. Там важно, что их изменение маловероятно, что всего один атрибут в во внешнем ключе. А естественным ключем могут оказаться все колонки таблицы. А если уже есть суррогаты, то лучше для стиля их ставить везде. Одинаковый стиль упрощает сопровождение.
4 июл 17, 19:37    [20613532]     Ответить | Цитировать Сообщить модератору
 Re: Первичный ключ (выделять отдельное поле или нет?)  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 33434
Olegrik
Здравствуйте!
Подскажите, пожплуйста, стоит ли мне создавать отдельный поле под первичный ключ, если у меня в таблице есть поле, значения которого не будут нулевые и будут уникальные.


Нет, не стоит


Olegrik
Насколько я понимаю, первичный ключ - это поле не нулевое и уникальное, которое дополнительно индексируется СУБД (может не всеми по-умолчанию).


Не обязательно одно поле, может быть и набор полей.


Olegrik
Если конкретнее, то я говорю про таблицы devicetype, cartridgetype, stock, employee.
Например, в качестве первичного ключа для таблицы cartridge я выбрал sn (серийный номер), т.к. эти значения не могут быть нулевыми или дублироваться.

Как будет правильнее по теории и на практике.


Ну, тут ещё надо 200 раз подумать, потому что очень многие поля, "уникальные" с точки зрения предметной области, оказываются
неуникальными с точки зрения технической.
Примеры, которые уже навязли в зубах -- это ИНН, номер паспорта и подобные вещи.
Это тема отдельной беседы, поищи, почитай.

Olegrik
PS. Индексируются ли автоматиччески поля с уникальными значениями в MySQL?


Автоматически -- нет.
При создании констрейнтов PRIMARY KEY или UNIQUE -- да.
11 июл 17, 18:44    [20634632]     Ответить | Цитировать Сообщить модератору
 Re: Первичный ключ (выделять отдельное поле или нет?)  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 33434
1) Значение поля первичного ключа записи должно быть уникально в пределах таблицы в течение всего срока жизни (внимание!!!) таблицы. Именно таблицы, а не записи! То есть удаление записи не "освобождает" значение первичного ключа этой записи для повторного использования.


Это сильно зависит от предметной области.


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


То, что строки не подходят для PK -- это заблуждение. Тексты/блобы -- да, не подходят, тебя просто пошлют когда будешь создавать.


Чтобы содержательное поле делать первичным ключом, нужно иметь к тому более чем веские основания. Которые встречаются крайне редко, даже я бы сказал - почти никогда.
Моя рекомендация - суррогатный ключ. И, если нужно, уникальный констрейнт (индекс) на содержательное поле.


Да, чаще всего проектировщики закладываются на то, чтобы поля PK (ни одно из) не имели никакого назначения в предметной области задачи. Это в 90% правильно, но иногда могут быть задачи, где это допустимо.

Я тоже бы рекомендовал остановиться на суррогатных ключах.
11 июл 17, 18:48    [20634644]     Ответить | Цитировать Сообщить модератору
 Re: Первичный ключ (выделять отдельное поле или нет?)  [new]
Бредятина
Member

Откуда: Москва
Сообщений: 1654
Olegrik, не используйте эту концепцию (ключ), и у Вас не будет никаких проблем. Используйте базы данных.
12 июл 17, 18:30    [20638189]     Ответить | Цитировать Сообщить модератору
 Re: Первичный ключ (выделять отдельное поле или нет?)  [new]
AX-Class
Member

Откуда:
Сообщений: 82
Работал как-то с оборудованием, серийники которого были уникальны в пределах Глобуса. Руководство решило менять серийники между оборудованием. Ничего такого, просто чтобы не иметь геморроя с бюрократией и простаиванием. Для наружной бухгалтерии ничего не менялось. Но для аналитики и всякого обслуживания объекты должны быть разными. Хорошо, что были суррогатные ключи.
Это я к тому, что когда начинается черный учет, естественные ключи перестают быть.
13 июл 17, 00:49    [20638943]     Ответить | Цитировать Сообщить модератору
 Re: Первичный ключ (выделять отдельное поле или нет?)  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 33434
AX-Class
Это я к тому, что когда начинается черный учет, естественные ключи перестают быть.


Тут проблема не в виде учёта, а в том, что в предметной области само значение естественного ключа имеет какой-то смысл, т.е. предметной области не всё равно, какое значение используется для идентификации данного конкретного экземпляра сущности.
Нормальный же PK по хорошему не должен нести никакой смысловой нагрузки КРОМЕ идентификации экземпляра.
13 июл 17, 11:29    [20639972]     Ответить | Цитировать Сообщить модератору
 Re: Первичный ключ (выделять отдельное поле или нет?)  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 51268
Блог
Olegrik
Как будет правильнее по теории и на практике.

По теории правильнее не плодить лишних полей. На практике надёжных естественных ключей не бывает.

Olegrik
Например, в качестве первичного ключа для таблицы cartridge я выбрал sn (серийный номер), т.к. эти значения не могут быть нулевыми или дублироваться.

Напишите инструкцию для кладовщика "Что делать, если по базе картридж №12345 год назад продан в Магадан, а на самом деле я держу его в руках, и номер точно именно такой, сверен три раза, и клиент хочет купить его прямо сейчас, потому что он единственный остался, а до Магадана не дозвониться".
17 июл 17, 02:10    [20648893]     Ответить | Цитировать Сообщить модератору
Все форумы / Проектирование БД Ответить