Правила Документирования Сущностей
Поля Сущности
- Все поля сущности описываются таблицей: имя, тип, обязательность, описание, ограничения, источник значения.
- Для enum полей перечисляются допустимые значения и смысл каждого значения.
- Boolean flags не используются для доменных состояний, если состояние может расширяться или участвует в бизнес-правилах.
- Вместо boolean flags используются enum:
VisibilityStatus,ReviewStatus,FeatureState,AvailabilityMode. - Magic constants запрещены. Любой конечный набор значений документируется как enum или справочник.
- Money хранится через
decimal+CurrencyId(short, справочникhandbook), time черезDateTimeOffset, проценты и rates черезdecimal. - Поля с типом
object,json,jsonb,metadata,settings,attributes,parameters,payload,contextзапрещены без отдельной именованной typed модели и таблицы полей. - Для полей
CountryId/CurrencyId/LanguageId(short) иRegionId/CityId(long) owner service — справочникhandbook(ADR-0063); указывается допустимый scope, freshness rule для replica/snapshot и поведение при архивной (IsArchived) записи справочника.
State Transitions
- Если сущность имеет status/state, раздел
State Transitionsобязателен. - Каждый переход описывается таблицей:
From,To, условие, инициатор, проверки, побочные эффекты. - Статус нельзя менять без проверки текущего состояния.
- Illegal transition должен иметь явный typed error.
- Для сущностей с жизненным циклом (бронирование, фиксация клиента, сделка, публикация объекта, сессии, провайдерские колбэки) таблица переходов обязательна.
- Если сущность не является state machine, раздел переходов опускается целиком (заглушка
Сущность не имеет state machineне пишется).
Invariants И Concurrency
- Инварианты описываются как проверяемые правила на уровне конкретных полей.
- Если параллельные правки сущности могут затирать друг друга, это фиксируется как бизнес-правило («правка не должна затирать чужую»); конкретный механизм оптимистичной блокировки — деталь реализации и в постановке не указывается.
- Для append-only сущностей явно пишется, что update/delete запрещены и исправления выполняются correction/reversal записью.
- Для денежных сумм, исторических снапшотов и провайдерских колбэков описывается, какие поля immutable после создания.
JSON / JSONB В Entity Docs
jsonbдопускается только для bounded document model: rule snapshot, external payload snapshot, UI/template variables, provider callback snapshot, audit/event payload.jsonbне используется для обычных связей 1:1, 1:N и M:N.- Связи описываются отдельными таблицами связи или дочерними сущностями: например
project_amenities,building_layouts,lot_restriction_values. - Если поле имеет тип
jsonилиjsonb, рядом обязательно описывается его модель в разделеJSONB Модели. - JSONB модель описывается как полноценная сущность: поле, JSON path, тип, обязательность, описание, ограничения, допустимые enum значения и правила совместимости.
- JSONB модель получает явное имя, например
BookingDecisionSnapshotModel,ProviderCallbackSnapshotModel,PriceRuleConditionModel; безымянные JSON-фрагменты запрещены. - Поле с типом
Dictionary<string, string>илиDictionary<string, object>допускается только после замены на typed коллекцию пар, где документированы допустимые ключи, тип значения для каждого ключа, максимальный размер и правила валидации. - Если подробная JSONB модель делает entity file больше лимита размера, модель выносится в соседний файл
<entity>-json-models.md; основной entity file сохраняет разделJSONB Моделисо ссылкой и кратким индексом моделей. - У каждой persisted JSONB модели есть
SchemaVersionили внешний version field рядом с агрегатом. - Breaking change требует новой версии модели и миграционного/совместимого reader.
- Для JSONB массивов нужно указать максимальный размер или объяснить, почему коллекция bounded.
- Для JSONB полей нужно указать GIN/BTREE expression indexes, если поле участвует в фильтрации, или прямо написать, что поле не индексируется и читается только вместе с агрегатом.
- JSONB не должен содержать secrets, raw PII, access/refresh tokens, provider credentials и unbounded external payload.
- Если JSONB хранит ссылку на другую сущность, это должен быть snapshot/reference для воспроизводимости решения, а не замена relational foreign key внутри сервиса.
Связи
- Связи внутри owning service моделируются явно: FK, link entity или дочерняя entity.
- Cross-service связи хранят foreign id и snapshot без cross-service FK.
- M:N связи описываются отдельной таблицей связи с полями и constraints.
- Если связь историческая и должна быть воспроизводимой, допускается snapshot, но текущая operational связь остается relational.
Replicas И Snapshots
Snapshotхранит состояние чужой сущности на момент события, решения или проводки; он immutable и нужен для audit/replay.Replicaхранит актуальную локальную проекцию чужой сущности; она eventually consistent и обновляется через documented consumers.- Entity doc для replica обязан иметь явное примечание
Это replica, не source of truth. - Для replica указываются owner/source service, producer events, consumer docs, freshness policy, stale behavior и поля, которые запрещено хранить.
- Replica не может содержать raw PII, secrets, payment requisites, tokens и provider credentials, если это не согласовано отдельной security-моделью.
- Financial/security-critical decisions по stale replica должны быть fail closed, manual review или owner API lookup по описанному алгоритму.
Events, Audit И Observability
- Entity doc перечисляет события, которые создают или изменяют сущность.
- Для сущностей с чувствительными данными указываются audit actions и masked fields.
- Для критичных state transitions указываются метрики изменения статусов.
- Инфраструктурные сущности общего назначения не копируются в каждый сервис. Они документируются в shared/common docs, а service docs описывают только business-specific behavior.
Обратные ссылки
Автоссылки: где используется этот документ.
- Домен (CQRS) (4): Entity / Aggregate: Channel (enum) + ChannelConfigEntity, Entity / Aggregate: NotificationTemplateEntity, Entity / Aggregate: RecipientContactEntity, Entity / Aggregate: UserNotificationSettingsEntity
- algorithm-documentation-rules.md (1): Правила Документирования Алгоритма
- strict-typed-documentation-rules.md (1): Правила Строгой Типизации Документации