## Что стоит заводить в НСИ

Справочник — кандидат, если он удовлетворяет минимум 3 из 5 критериев ниже.

### 1. Shared между ≥ 2 потребителями

Данные читают/используют как минимум два разных сервиса (или будут в обозримом roadmap).

Примеры: Космические аппараты (планировщик миссий + геопортал + биллинг), наземные станции (планировщик + телеметрия + Альтум), классы разрешения (геопортал + ML pipeline).

Если данные нужны только одному сервису — храни локально. Не плоди интеграционные точки на пустом месте.

### 2. Slow change rate (часы → недели, а не секунды)

Изменяется редко — раз в неделю / месяц / квартал. Не транзакционные данные.

Частота изменений | Это НСИ?
--- | ---
Раз в год — справочник стран | ✓ да
Раз в квартал — справочник миссий ДЗЗ | ✓ да
Раз в неделю — справочник антенн (новые станции) | ✓ да
Раз в час — текущая температура спутника | ✗ нет (телеметрия)
100×/сек — статус заявки на съёмку | ✗ нет (state machine)

### 3. Нужна validity-window (validFrom / validTo)

Данные актуальны на определённый период. Закрытие/замена записи через bitemporal versioning, не через `DELETE`.

Примеры: Тарифы (действуют с 01.01.2026), орбитальные параметры (TLE на конкретную epoch), составы flight crew (период).

Если данные «текущее состояние и забыли» — может быть просто config или KV store.

### 4. Требуется audit-trail (compliance / governance)

Нужно знать кто, когда, почему изменил запись — для compliance, forensics, отката.

Все справочники в Ordinis по умолчанию имеют Hibernate Envers audit log с full history.

Примеры: Регуляторные классификации, security clearances, тарифные планы (для финансового audit'а).

### 5. Есть схема (structured, validated)

Данные имеют стабильную JSON-Schema с required-полями и валидацией. Не «свободный мешок ключей».

Если структура каждую неделю меняется и нет SLA на стабильность — может быть это ещё не НСИ, а Notion-like wiki.

## Что не стоит заводить в НСИ

### A. Транзакционные данные

Заявки, заказы, события, измерения, журналы. Это transactional store (PostgreSQL/Kafka topic application'а), не НСИ.

растёт линейно со временем работы системы

### B. Высокочастотные мутации

> 100 updates/sec — не лезет в audit, забивает Kafka outbox. Для счётчиков и telemetry — Redis / time-series DB / Prometheus.

### C. Производные / вычисляемые данные

Если значение вычисляется из других данных — храни источник, не результат. Кэш производных — в Redis с invalidation.

«активные миссии за месяц» — это query, не справочник

### D. PII / sensitive без access control

Персональные данные физлиц, payment data, security secrets. Ordinis сейчас поддерживает scope (`PUBLIC` / `INTERNAL` / `RESTRICTED`), но per-record ACL пока в roadmap (Q4 2026).

Для PII — выделенный сервис с шифрованием и compliance audit, не общий НСИ.

### E. Большие BLOB'ы

Изображения, PDF, сырые телеметрические дампы. → MinIO/S3 + ссылка в справочнике, но не контент в `data`.

### F. Данные, нужные только одному сервису

Если справочник никогда не покинет границу сервиса X — это его внутренний config. Не выноси наружу.

boundary test — «может ли потребитель Y разумно захотеть читать это?». Нет → не НСИ

## Чек-лист перед созданием справочника

### 10 вопросов · ответь "да" / "нет"

1. Минимум один реальный потребитель кроме создателя? (named system)
2. Согласованная schema (фиксированный набор полей)?
3. Change rate < 10/мин в среднем?
4. Validity windows имеют смысл (или достаточно "current state")?
5. Audit-trail нужен для compliance / forensics?
6. Owner назначен? Reviewer pool назначен (для approval-required dicts)?
7. Bundle подобран? (cuod / geo / comms / delivery — см. existing)
8. Локализация — нужна? Какие locale supported?
9. Scope: PUBLIC / INTERNAL / RESTRICTED?
10. Onboarding plan — кто и когда мигрирует существующие consumers?

≥ 7 yes — заводи. Если меньше — обсуди с Ordinis team, возможно паттерн не НСИ.

## Процесс создания справочника

### Простой случай (PUBLIC scope, owner = создающий)

Owner открывает `/dictionaries` admin UI → Создать
Заполняет name, displayName, schema (через UI builder или импорт JSON)
Тестит в staging (`ordinis.k8s.265.nstart.cloud`)
После validation — publish; данные иммутабельно зашиваются в Kafka outbox
Сообщение в `#ordinis` Slack — потребители подхватывают через `/dictionaries` listing

### Approval-required (для критичных)

Owner создаёт schema draft (не публикует сразу)
Reviewer pool получает email уведомление
Reviewer открывает `/reviews` → diff → approve/reject
После approval — auto-publish через workflow

### Onboarding существующих данных (миграция)

Owner экспортирует существующий справочник из source-системы в CSV/JSON
Создаёт schema в Ordinis (UI builder)
Bulk import API (Q4 2026) или manual seed через bundle YAML
Запускает параллельное чтение — consumers читают и из source, и из Ordinis, сверяют diff
После недели зелёного diff — переключают consumers на Ordinis exclusive
Декомиссия source: справочник удаляется в source, остаётся в Ordinis

## Conventions для schema

Чтобы интеграторам было проще читать твой справочник:

- `businessKey` должен быть human-readable стабильный идентификатор. Не UUID — `GS_MOSCOW_A1` лучше чем `b284f74e-60c8-…`.
- Required fields — минимум что нужно для валидности. Не объявляй required то, что может быть пустым в legacy data.
- `x-localized: true` на текстовых полях, которые должны переводиться (`name`, `displayName`, `description`).
- `x-references: target_dict.field` для FK — Ordinis валидирует и строит граф.
- `x-section` — группировка полей в UI editor'е (`Основное`, `Геометрия`, `Метаданные`).
- `enum` для closed lists вместо свободной строки (тип КА, статус миссии).
- `format: date-time` для timestamps (Ordinis парсит как ISO-8601).

## Anti-patterns (видели на практике)

Справочник = state machine состояний заявки. `application_status: NEW/APPROVED/REJECTED` — это enum в схеме заявки, а не отдельный справочник.

Справочник под per-user preferences. Предпочтения юзера X — это его profile в auth-сервисе.

Справочник вместо feature flag. Если читается на каждом запросе для decisions — config service (Spring Cloud Config + LaunchDarkly-like).

«Логирование» через справочник. Лог событий — Kafka topic + Loki, не НСИ.

Справочник, чтобы передать данные между двумя своими микросервисами. Используй внутреннюю DB / message broker, не НСИ.

## Когда сомневаешься — спроси

Контакты Ordinis team

- Slack `#ordinis`
- Email: zimin.an@nstart.space
- Office-hours: четверг 15:00 МСК (ad-hoc на DM)

Лучше 30 минут на консультацию, чем месяц на отрыв справочника обратно в local store.

Ordinis MDM · v1.0 · 2026-05 · NStart