Коли в обміні між двома системами передається лише номер документа, одна й та сама послідовність цифр може належати різним документам різних людей. Система бачить збіг і зіставляє записи. Помилка виглядає як успіх.
Умовний приклад збігу
Два реєстри обмінюються даними, ключ для зіставлення: номер документа. Записи нижче вигадані, але ситуація типова:
| Реєстр | Людина | Що в полі «номер» | Який це документ насправді |
|---|---|---|---|
| А | Дитина, 2015 р. н. | 123456 |
свідоцтво про народження, серія в іншому полі |
| Б | Дорослий, 1971 р. н. | 123456 |
паспорт-книжечка, серія в іншому полі |
Обидва записи коректні. Але якщо зіставляти лише за номером, дитина з реєстру А «знайдеться» в реєстрі Б. Далі все залежить від того, що робить система зі збігом: підтягує адресу, перевіряє право на допомогу, рахує унікальних отримувачів.
Номер без типу: будинок без вулиці
Номер документа схожий на номер будинку. Будинок 12 є майже на кожній вулиці, і без назви вулиці лист не дійде за адресою. Тип документа і серія тут працюють як вулиця.
Аналогія неідеальна: у місті хоча б назви вулиць не повторюються. А серії і номери різних типів документів інколи перетинаються, тож навіть «вулиця» потребує уточнення, яка саме.
Звідки беруться хибні збіги
Збіг номерів рідко буває рідкісною випадковістю. Зазвичай за ним стоїть одна з чотирьох причин:
- Різні нумерації. У кожного типу документа своя нумерація, і шість цифр легко повторюються між типами.
- Серія в іншому полі. Номер передали, серію ні, або серію записали в окреме поле, яке не бере участі в зіставленні.
- Втрачені нулі. Номер зберегли як число, і
012345перетворився на12345, тобто на зовсім інший номер. - Схожі літери. Латинські
A,B,Kвиглядають як кириличніА,В,К, але для системи це різні символи.
Перші дві причини дають хибні збіги, дві останні хибні розбіжності: та сама людина в двох реєстрах не знаходиться. В обох випадках звіт рахує не те.
Які поля додати в обмін
Номер стає надійним ключем лише разом з кількома полями поруч:
- Тип документа як код з довідника, а не текст, який кожен пише по-своєму.
- Серія окремим полем, якщо вона є в цього типу документа.
- Номер як рядок, без пробілів і без перетворення на число.
- Дата видачі як додаткова перевірка, коли номери все ж збігаються.
- Країна видачі для іноземних документів.
Ключ для зіставлення тоді виглядає так: тип, серія і номер разом, після нормалізації (прибрати пробіли, звести латиницю і кирилицю до одного алфавіту за погодженим правилом).
Перевірка формату за типом
Перевірка «поле не порожнє» не бачить різниці між номером ID-картки і датою, вписаною не в те поле. Правила формату мають залежати від типу документа. Спрощений приклад для українських документів:
| Тип документа | Правило формату (спрощено) |
|---|---|
| Паспорт у формі ID-картки | 9 цифр |
| Паспорт-книжечка | 2 літери кирилиці і 6 цифр |
| Свідоцтво про народження | серія і 6 цифр |
| Іноземний документ | обов'язкова країна видачі |
Такі правила варто запускати двічі: під час введення даних і під час отримання їх в обміні. Запис, що не пройшов перевірку, має повертатися відправнику з причиною, а не зникати мовчки або потрапляти в реєстр «як є».
Чому це питання архітектури, а не дрібниця інтерфейсу
Легко вирішити, що це деталь конкретного API чи SOAP-сервісу і її поправлять програмісти. Насправді це питання контракту обміну: які поля обов'язкові, з якого довідника береться тип, хто перевіряє формат.
Якщо в контракті є одне поле «номер документа», кожна система-отримувач угадує тип по-своєму. Хтось за довжиною, хтось за наявністю літер, хтось взагалі не вгадує. Виправляти це в кожному звіті окремо дорого і ненадійно. Виправляти в контракті один раз дешевше, навіть якщо доведеться погоджувати зміну з кількома сторонами.
Що зробити на практиці
- Відкрийте опис обміну і перевірте, чи передається тип документа окремим полем.
- Якщо ні, додайте тип з довідника і серію окремо від номера.
- Опишіть правила формату для кожного типу і запустіть їх на введенні та на отриманні.
- Зіставте два реєстри двічі: лише за номером і за повним ключем. Різниця між результатами покаже кількість хибних збігів.
Останній крок займає пів години, а дає аргумент, який легко показати керівництву: скільки записів зараз зіставляються помилково. Саме з таких аргументів починається розмова про архітектуру даних.
А як у вас: обмін передає тип документа окремим полем чи система все ще вгадує його за довжиною номера?
