Можно ли использовать номер паспорта как первичный ключ и почему это плохой выбор
Что проверяют
Понимаете ли вы разницу между естественным и суррогатным ключом и умеете ли увидеть в требованиях, что «уникальный на вид» атрибут на деле меняется, повторяется и относится к персональным данным. Следом обычно просят нарисовать, как тогда хранить паспорт.
Как отвечать
Технически СУБД не запретит, но для аналитика это ошибка моделирования. Аргументы стоит давать от предметной области:
- паспорт меняется: паспорт гражданина РФ меняют в 20 и 45 лет, при смене фамилии, утере, порче. Человек тот же, а ключ другой, и его придётся каскадно обновлять во всех связанных таблицах, интеграциях и выгрузках;
- паспорт есть не у всех и не один: у детей свидетельство о рождении, у иностранцев свои документы, у части людей два гражданства. Номера разных стран могут совпасть, так что уникален только набор «тип документа, страна, серия, номер»;
- ошибки ввода: оператор ошибся цифрой, и исправление опечатки превращается в изменение первичного ключа;
- персональные данные: первичный ключ расползается по внешним ключам, логам, URL, отчётам, тестовым стендам. Если это номер паспорта, персональные данные оказываются везде, и выполнить требования 152-ФЗ по их защите и обезличиванию становится намного сложнее.
Правильная модель: у сущности «Клиент» суррогатный ключ (bigint identity или UUID, для распределённых систем удобен UUIDv7, упорядоченный по времени). Документы выносятся в отдельную сущность «Документ, удостоверяющий личность» со связью один ко многим, периодом действия и уникальным ограничением на комбинацию реквизитов среди действующих документов. В ТЗ это фиксируется бизнес-правилами: как искать клиента по документу и что происходит при замене паспорта.
Где спотыкаются
Отвечают «номер уникален, значит подходит» и не проверяют, стабилен ли он во времени.
Заменяют ключ на UUID и на этом останавливаются. Без уникального ограничения на реквизиты документа в базе быстро появятся дубли одного и того же клиента.
Путают первичный ключ с идентификатором для людей. Номер клиента, который видит оператор или сам клиент, может быть отдельным полем, а технический ключ наружу лучше не показывать.