TLDR:
Всё плохо.
Преамбула:
На статью вдохновил ряд предыдущих заблуждений программистов о почтовых адресах, времени и именах.
Все примеры, указанные в статье, вымышлены; некоторые примеры приведены на основе выдачи поисковых запросов.
Кат с философским описанием.
В жизни некоторых программистов наступает момент, когда им ставится задача «Написать модуль работы с персональными данными пользователей». Причём, по традиции, желательно «ещё вчера». Задача на вид несложная, за пару часов до дедлайна программист нажимает кнопку «Деплой» и уходит на законные выходные. Утром в субботу телефон пиликает сообщением о новом письме: техподдержка открывает тикет «Настырный пользователь не может пройти регистрацию». Грустно вздохнув и отложив в сторону билеты на хоккей, программист проверяет полученные данные и садится за ноутбук. Так в проекте появляется первый костыль…
Описанное выше, конечно же, происходит в параллельной вселенной, было 20 лет назад и вообще, сейчас полный Agile. Но вдруг какой‑то из примеров будет вам полезен.
Документ удостоверяющий личность — только паспорт.
В законодательстве разных стран предусмотрен различный набор документов, по которым может быть идентифицирован человек: в Российской Федерации это паспорт гражданина, дипломатический паспорт, служебный паспорт, военный билет, временное удостоверение личности, удостоверение личности моряка и тд. Отказ в предоставлении услуг при непредоставлении паспорта может расцениваться как жестокое нарушение Конституционных прав пользователя.
Если ваш софт планирует пересечь наземные границы и будет использоваться в других странах, дополнительно запланируйте широкий ассортимент поддерживаемых документов: ID‑карта (Узбекистан, Казахстан, Армения), водительское удостоверение (Узбекистан), удостоверение беженца (Казахстан), свидетельство на возвращение (Казахстан, Армения).
Если в вашем софте ожидается регистрация иностранцев, сюда же добавляются загранпаспорта по стандарту ICAO. Причём, если чётко следовать букве законодательства, загранпаспорта являются документами удостоверяющими личность гражданина, находящегося за пределами родины.
Возможный выход — определить наиболее востребованные кейсы и волевым решением ограничить круг потенциальных клиентов и их документов.
Серия и номер паспорта в базе всегда уникальны.
Первый попавшийся пример: если судить по картинкам в интернете, паспорт с серией‑номером вида «8 цифр» может быть и у гражданина Израиля, и у гражданина Чехии. Соответственно, можно ожидать коллизий в случае использования системы гражданами обеих стран.
Если добавить возможность регистрации по иным документам, удостоверяющим личность, и включить поддержку старых (предыдущих) версий документов, проблемы дублирования в базе гарантированы.
У документов всегда последовательный номер, если есть паспорт c номером AB1234567, где-то есть паспорт с номером AB1234568.
Паспорта могут аннулироваться в связи с ошибкой при выдаче.
«Красивый» номер вида «шесть семёрок» может быть сгенерирован разово по просьбе, высказанной с должным уважением и его «соседи» появятся лет через 5.
Серия и номер документа всегда соответствует требованиям (шаблону).
Паспортизация — важный элемент любого государства, поэтому с практически 100% вероятностью так и будет. «Но есть нюанс» ©: «шаблон» для серии и номера документа различен. Серия и номер паспорта Российской Федерации состоит из 10 цифр, паспорта Камеруна — из 7. В Беларуси первыми идут две латинские буквы (обозначение региона), в Узбекистане серия состоит из латинских букв, которые последовательно увеличиваются при достижении всех девяток в номере: AA, AB, AC. Сюда же добавим поддержку иных видов документов (удостоверение моряка, водительское удостоверение).
Серия и номер паспорта всегда написаны правильно.
При интеграции систем или обогащении данных могут возникнуть ошибки, когда введённые вручную «...адцать лет назад» данные некорректны. И если с ошибками вида «буквы на кириллице вместо латиницы», «лишние пробелы» ETL системы справляются достаточно хорошо, то недостающие или лишние цифры‑буквы становятся большой проблемой. Решение остаётся на получателе данных: принимать некорректные данные в надежде когда‑нибудь их исправить или игнорировать, уменьшая реальное количество записей.
Знакомые рассказывали, что в одном кейсе интеграции систем «мусорными« были 60% данных.
Дата выдачи паспорта всегда в прошлом.
Если не рассматривать человеческий фактор и вариант «наша система работает в виртуальной машине, на которой сбилась дата», можно предположить теоретическую ситуацию «Человек получает загранпаспорт на Чукотке и сразу пересекает Берингов пролив на Аляску с паспортом, выданным Завтра».
У паспорта всегда есть срок действия.
Нет, старшее поколение обычно не нуждается в замене паспорта.
Дата рождения всегда валидна.
В зависимости от законодательства страны могут быть ситуации, разрешающие некорректную дату в паспорте. Например, если известен только год рождения, а архивные документы утрачены (актуально для старшего поколения), день и месяц могут заменяться нулями.
Стандарт ИКАО позволяет заменять «иксами» недостающие части дат. Автор лично встречал в строке «Дата рождения» значения «00.00.1940» и «ХХ.ХХ.1965». Сумеет ли ваша программа грамотно их распарсить и записать в базу? Большой вопрос.
Дата рождения всегда в прошлом.
Частный случай пункта 8 — если неизвестен даже год рождения, могут быть выставлены любые значения, стандартные для данного софта. В одной крупной программе встречал значение по умолчанию для года рождения 9999. При этом в самой программе предусмотрена обработка подобных событий. Но если данные начинают передаваться в другую систему, может возникнуть интересный казус.
Пол пользователя не может измениться в процессе использования данных.
Может.
10.1. ОК, пол не может измениться в странах, где такое запрещено законодательством.
Крайне редкие медицинские случаи: родился ребёнок с признаками обоих полов. При первой персонализации родители записали ребёнка девочкой (например). Ближе к половому созреванию визуально стали больше проявляться признаки мужского пола. В таких случаях пол будет изменён.
10.2. Пол всегда определён.
Если рождается ребёнок с признаками обоих полов и погибает до первой персонализации, в медицинском софте его пол может быть указан как «неизвестный».
В официальном документе, удостоверяющем личность, всегда актуальная информация.
Простой пример: девушка вышла замуж, сменила фамилию и поменяла паспорт. Затем на основании нового паспорта она поменяла водительское удостоверение. В промежутке между этими событиями у неё два актуальных документа, подтверждающих личность, выданных на разные фамилии.
Документ, удостоверяющий личность, всегда является актуальным.
Выдуманный пример из банковской сферы: в понедельник гражданин З. подаёт заявление об утере паспорта, платит штраф. Во вторник гражданин З. приходит в банк и берёт кредит на «утерянный паспорт».
И начинается долгая судебная история, в ходе которой гражданин З. утверждает, что никакого кредита он не брал, а это всё мошенники, которые пытаются опорочить его честное имя.
Логичный выход: проверять в центральных базах статус документа.
В момент использования софта пользователь жив.
Кто-то может воспользоваться чужой учётной записью и после смерти владельца учётки.
Кто-то из родственников/друзей может попытаться вывести деньги с пластиковой карты усопшего через системы интернет-банкинга.
Кто-то должен получить результаты выполнения «долгоиграющих» заявок пользователя и после его смерти.
В центральных базах может быть ошибочно отмечено, что пользователь покинул наш бренный мир, соответственно пользователь не может получить банковские или иные услуги. Можно даже провести конкурс на самое лучшее сообщение пользователю о том, что он не может получить желаемый доступ по причине того, что мы считаем его мёртвым. Мой фаворит: «Zombies are not allowed in our system».
У пользователя всегда есть валидное гражданство.
Лица без гражданства передают большой и пламенный привет.
У пользователя всегда есть валидное гражданство или отметка ЛБГ.
После распада СССР был достаточно большой промежуток времени, в течение которого жители могли поменять свой паспорт на паспорт нового государства. То есть в тот момент это были граждане несуществующей страны.
И даже после истечения сроков замены представители старшего поколения (особенно в отдалённых деревеньках) не спешили принять гражданство той или иной страны.
Другой пример из современности: Республика Косово отсутствует в списке государств ISO-3166, но на практике коды KS и RKS используются.Дополнительно см. список частично признанных государств.
Всегда есть валидное место рождения.
В дополнение к предыдущему пункту: место рождения может быть не валидным в текущий момент: населённый пункт переименован, упразднён.
Исключительно чтобы не плодить лонгриды, на этом предлагаю остановиться.
Продолжения статьи: