Всегда создавать уникальные ключи, когда это возможно? - PullRequest
0 голосов
/ 28 ноября 2011

Должны ли вы всегда создавать уникальные ключи, когда это возможно?

Например, допустим, у меня есть таблица с тремя полями: первичный ключ - идентификатор студента, имя, фамилия и идентификатор студента.

Если у двух учеников нет имени и фамилии, я должен создать уникальный ключ для этих двух полей?

Ответы [ 8 ]

1 голос
/ 28 ноября 2011

Да!

Если вам когда-нибудь понадобится обновить или удалить строки из таблицы, очень полезно иметь что-то, чтобы уникально идентифицировать каждую строку в таблице.Я не думаю, что можно гарантировать, что никакие два студента не будут иметь одинаковое имя.Даже добавление даты рождения по-прежнему не может гарантировать, что они всегда будут уникальными.Я бы рекомендовал добавить автоинкрементный INT или BIGINT в качестве первичного ключа.

Вы всегда можете добавить ограничение Unique и также удалить его, если оно станет проблемой.

1 голос
/ 28 ноября 2011

Простой способ сделать это - использовать автоматически сгенерированный Guid (глобальный уникальный идентификатор) для идентификации студента. «Гарантируется» быть уникальным каждый раз, когда генерируется. Имена могут меняться (например, когда кто-то выходит замуж), но какое-то автоматически сгенерированное значение не имеет смысла, поэтому менять его не нужно.

http://en.wikipedia.org/wiki/Globally_unique_identifier

1 голос
/ 28 ноября 2011

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

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

1 голос
/ 28 ноября 2011

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

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

PS: вы могли бы сэкономить немного места для хранения, но сегодня это дешево и нет необходимости жертвовать хорошей практикой для этого

1 голос
/ 28 ноября 2011

Уникальные ключи должны соответствовать бизнес-определениям;если studentID является «полунатуральным» ключом (он имеет уникальное значение, которое существует за пределами вашей конкретной базы данных), то этого должно быть достаточно в качестве вашего уникального ключа.

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

1 голос
/ 28 ноября 2011

Не думайте, что ни у одного ученика не будет одинакового имени.

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

1 голос
/ 28 ноября 2011

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

0 голосов
/ 29 ноября 2011

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

Обратите внимание, что строка в этой таблице является предложением I.e. что существует студент, зачисленный с именем «x» и фамилией «y» и идентификатором студента «z». Очевидно, что СУБД не имеет понятия о том, верно ли это утверждение в реальном мире. Что обычно происходит, так это наличие надежного источника для проверки данных. Предприятие уполномочит сотрудника (директора и т. Д.) На эту роль. Допустим, именно сотрудник по регистрации отвечает за проверку того, что «x y» является реальным человеком, что они имеют право на регистрацию, и этот человек является тем, кем они себя называют. Как правило, они требуют просмотра документов (сертификатов, паспорта и т. Д.), Получения справок, опроса лица, проверки публичных записей и т. Д. Конечно, сотрудник по регистрации может делегировать свои обязанности другим сотрудникам или нанять агента.

В какой-то момент они будут удовлетворены и для удобства выдают свой собственный идентификатор, студенческий билет. Ошибки действительно случаются, и может оказаться, что это значение не является уникальным, и в этом случае ответственный за зачисление будет отвечать за решение проблемы и выдавать нового студента. Возможно, они будут использовать программное обеспечение для создания ценности, чтобы смягчить против таких проблем. Студенческий билет будет выдан студенту и будет использоваться на предприятии для идентификации личности для удобства всех заинтересованных лиц. Им даже может быть выдан документ (например, удостоверение личности с фотографией), чтобы помочь в идентификации, на основании уровня доверия в данном контексте (например, может потребоваться предъявить удостоверение личности с фотографией, чтобы сдать экзамен). Если учащийся забудет свое удостоверение личности, потеряет выданные документы и т. Д., То регистрационный офис сможет получить его из записей, например, со ссылкой на копии документов, взятых в процессе проверки; они вряд ли будут использовать только имя и фамилию.

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

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