# Contract: Identifier Normalization Version: 1.1 ## Purpose Правила хранения и сравнения идентификаторов оборудования: серийные номера, вендоры, версии прошивок, партномера, артикулы. See `README.md` for Go and SQL examples. ## Правило Оригинальное значение **сохраняется как пришло** — регистр не меняется. Все сравнения, поиск и дедупликация выполняются **без учёта регистра**. ``` Пришло: "SN-001-ABC" → хранится: "SN-001-ABC" Пришло: "sn-001-abc" → это тот же объект, не дубликат ``` ## Применяется к полям - Серийный номер (`serial_number`, `serial`) - Вендор / производитель (`vendor`, `manufacturer`) - Версия прошивки (`firmware_version`, `fw_version`) - Партномер (`part_number`, `part_no`) - Артикул (`article`, `sku`) ## Реализация - Go: сравнение только через `strings.EqualFold`, никогда `==`. - Go: ключ дедупликации в map — `strings.ToLower(value)`; сам объект хранит оригинал. - SQL-поиск: `WHERE LOWER(col) = LOWER(?)`. - Уникальность: MySQL/MariaDB — case-insensitive collation (`utf8mb4_unicode_ci`) + unique index; SQLite — `CREATE UNIQUE INDEX ... ON t (LOWER(col))`. ## Что не делать - Не приводить значение к нижнему или верхнему регистру перед сохранением. - Не считать `"SN-001"` и `"sn-001"` разными объектами. - Не использовать `==` для сравнения идентификаторов в Go — только `strings.EqualFold`.