пятница, февраля 01, 2008

Primary keys in life

Те, кто изучал реляционные базы данных в теории обычно убеждены в том, что некоторые виды объектов по самой своей природе обладают некоторым привычным ключом. Обычно приводят такие примеры: человек — серия и номер паспорта или номер социального страхования или ИНН; книга — ISBN и так далее. На первый взгляд кажется, что эти поля подходят для первичного ключа. При некоторых допущениях так и есть. Однако так ли это на самом деле? Рассмотрим того же человека:
  • Серия и паспорт человека меняется как минимум трижды в течение жизни;
  • У книги может быть как несколько номеров ISBN, так и не быть ни одного;
  • Бывают люди без ИНН и номера социального страхования
Однако на этом проблему не заканчиваются. Что будет если нам придется импортировать данные из сторонних систем? Можем ли мы использовать первичные ключи для этого? Предположим, мы импортируем список людей содержащий имена, даты рождения, данные паспорта и СНИЛС. Совпадение каких полей может служить однозначной идентификации? Правильный ответ: только совпадение всех полей позволяет однозначно связать две записи. Рассмотрим пример подробнее. У нас есть несколько кластеров данных в каждой записи: 1. Тройка фамилия-имя-отчество 2. Дата рождения 3. Данные паспорта (серия-номер-дата выдачи-выдавший орган) 4. Номер социального страхования СНИЛС Я намеренно упустил из виду существование других документов удостоверяющих личность, лиц без гражданства, иностранных граждан и т.п. Будет достаточно одного простейшего случая. Из предметной области мы знаем:
  • У человека может измениться фамилия, что происходит довольно часто, имя или отчество, что происходит занчительно реже;
  • В особых случаях у человека может измениться дата рождения;
  • Смена фамилии, имени или даты рождения влечет смену документа удостоверяющего личность
  • Человек может получить новый паспорт с совершенно другими данными, никак не связанными с предыдущим;
  • Человек может получить другой номер ИНН, что происходит довольно редко, но происходит;
  • Человек может получить другой СНИЛС, что происходит довольно регулярно;
  • При внесении данных в базу возможны ошибки оператора;
  • На больших объемах данные проявляется "эффект больших чисел": разные люди с частично совпадающими данными.
Этого уже достаточно чтобы понять — никакого первичного ключа здесь нет. Более того, как только нам потребуется вносить данные в систему мы непременно столкнемся с проблемой идентификации, которую невозможно разрешить автоматически. Единственный выход — система синхронизации на основе правил и ручного анализ спорных случаев оператором. Любые попытки изобрести первичный ключ из любой комбинации полей приведут к отсечению части вполне законных use cases предметной области, как это произошло здесь

1 комментарий:

Анонимный комментирует...

фио + год рождения + страна + город + номер роддома ИЛИ хеш контрольных точек отпечатка большого пальца левой руки например ;-)