Часто в таблице, которая не имеет естественного ключа, пользователям по-прежнему полезно иметь уникально сгенерированный идентификатор. Если таблица имеет суррогатный первичный ключ (и в этом случае вы, конечно, ожидаете этого), должен ли этот ключ быть открыт пользователю или для этой цели должно использоваться другое поле?
Одна из причин не раскрывать суррогатный ключ состоит в том, что теперь вы не можете выполнять операции, которые сохраняют связь между записями, но изменять значения ключа, такие как определенные виды удаления / повторной вставки, многие методы копирования данных из одной базы данных в другой и т. д.
Основным преимуществом раскрытия суррогатного ключа является простота использования поля, которое у вас есть.
При каких обстоятельствах лучше напрямую предоставлять суррогатный ключ пользователям?
Ответы:
Вы должны быть готовы к любому идентификатору, который предоставляется пользователям / клиентам, нуждающимся в изменении, и изменение идентификатора строки в базе данных и распространение этого изменения на все внешние ключи просто требует разрыва данных.
Если данные не имеют естественного бизнес-ключа, вы можете добавить дополнительное поле для «бизнес-идентификатора». Это должно быть оптимизировано для процессов, для которых оно используется. Ввод с клавиатуры телефона означает только цифры. По телефону / словесные средства избегайте одинаковых звучащих символов (B / D, M / N и т. Д.). Вы можете даже автоматически сгенерировать некоторую легко запоминающуюся фразу («зеленое желе»).
В результате бизнес может впоследствии изменить способ обращения к записям, и единственное изменение в схеме данных - это либо добавление нового столбца для этого стиля идентификатора, либо преобразование уже существующих идентификаторов. Изменение не распространяется по всей базе данных, и у вас все еще есть один идентификатор (суррогат), который действителен с течением времени.
Короче, я бы не стал раскрывать суррогатные ключи пользователям. Как отмечают комментарии, суррогатные ключи почти никогда не должны меняться. И наоборот, предприятия хотят изменить все. Если раскрыт суррогатный ключ, это всего лишь вопрос времени, когда бизнес захочет его изменить.
Как примечание, когда я говорю «разоблачение» здесь, я имею в виду дать ключ пользователю с ожиданием, что он использует его напрямую (например, позвонив в службу поддержки с номером заказа).
источник
В некоторых случаях суррогатные ключи ожидаются и имеют смысл для пользователей. Мой любимый пример - «номер заказа». Номер заказа на самом деле не является естественным ключом: естественным ключом может быть отметка времени плюс пользователь или, возможно, больше, если вы ожидаете, что пользователи сгенерируют более одного заказа в пределах детализации вашей отметки времени.
Тем не менее, пользователи понимают и ожидают удобство номера заказа. Там нет никакого вреда и много ценности, если вы дадите пользователям знать о них.
С другой стороны, некоторые суррогатные ключи не имеют смысла для пользователя. Конечно, у моей медицинской страховой компании есть какой-то суррогатный ключ, который идентифицирует меня на основе моего идентификатора участника, даты рождения, носителя и т. Д., Но меня это не волнует, меня интересует информация на моей карте (которая часто включает в себя идентификаторы на моего работодателя и не уникальны во всей вселенной ... Отсюда и суррогатный ключ в страховой компании).
источник
Вы должны предоставлять суррогатный ключ только в том случае, если это правильно сгенерированный GUID / UUID *. Разоблачение последовательных суррогатных ключей - это номер 4 в топ-10 проблем безопасности OWASP.
* На практике лучше предположить, что он не был сгенерирован должным образом для этих целей, если только вы не знаете, что он был создан криптографически безопасным генератором случайных или псевдослучайных чисел.
источник
Если таблица не имеет естественного ключа, суррогатные ключи допускают такие строки.
Я бы назвал эти искусственные ключи вместо суррогатных ключей, но это различие не важно для этого вопроса.
Теперь, если предположить, что есть важные данные, ссылающиеся на эти суррогатные ключи через внешние ключи, как конечные пользователи узнают, какую строку обновлять, если они не знают значений суррогатных ключей?
источник
По словам непрофессионала:
источник
Вы должны ТОЛЬКО выставлять пользователю поле, которое предоставляет полезную информацию пользователю, либо напрямую, либо сообщая вам о дефектах.
и наоборот, вы ВСЕГДА должны раскрывать «суррогатные первичные ключи», когда они являются основным средством идентификации записи (простой или сложной) для взаимодействия, которое выполняет пользователь.
источник
Не должно иметь значения, открываете ли вы ключи или нет конечному пользователю. Ваше приложение должно выполнить необходимую авторизацию, чтобы, например, простое знание идентификатора заказа не позволило им получить доступ к тому, к чему у них обычно не было бы доступа.
предостережение: это предполагает веб-приложение или n-уровневое приложение, где авторизация на стороне сервера возможна / осуществима. Если у вас есть приложение VB, которое непосредственно выполняет sql, это совершенно другая проблема.
источник