Спецификация БД сервиса — артефакт системного аналитика, который фиксирует как сервис хранит и интерпретирует данные: логическую и физическую модель, ограничения, жизненный цикл записей, объёмы, политики доступа и миграции. Документ не заменяет BRD/SRS — он детализирует persistence в объёме, достаточном для реализации, ревью и согласования с API, NFR и ADR. Теория моделирования данных — в 03.03.01 ER-диаграммы (сущность-связь) и 03.03.02 Логическая и физическая модель данных.
1. Назначение
Спецификацию БД пишет системный аналитик (или аналитик с поддержкой DBA/архитектора); её читают разработка backend, DBA, QA, security и интеграционные команды. Для QA в спеке фиксируются сущности, статусы и идентификаторы, которые должны попасть в test data (§3.14) — иначе сценарии из stories не воспроизводятся на стенде.
Шаблон закрывает четыре задачи:
- Контракт persistence — сущности, атрибуты, связи, ограничения и индексы конкретного сервиса; одна спека = одна граница владения данными (bounded context), а не «единая БД на всё».
- Семантика полей — словарь данных (data dictionary) с типом, обязательностью, PII и бизнес-смыслом; без него dev, QA и интеграции интерпретируют колонки по-разному.
- Мост к контрактам — явный mapping API ↔ БД (канон — §3.6) и event payload ↔ таблицы/outbox; расхождения именования и nullable не остаются «на усмотрение разработчика».
- Точка трассировки — идентификатор спеки
DB-SPEC-{контекст}-v{N}→ FR/SRS → user story → API spec → migration → test data; схема имён — 10.01.15 Шаблон матрицы трассировки. Изменения схемы проходят через change control (02.05.02 Управление изменениями (Change Control Board)) вместе с downstream-артефактами.
В микросервисной архитектуре спека фиксирует что принадлежит сервису и что запрещено читать/писать напрямую из других сервисов.
2. Когда использовать
Подходит, если:
- проектируете или меняете persistence нового или существующего сервиса (CRUD, workflow, event sourcing, outbox);
- в том же релизе меняются API (10.01.04 Шаблон спецификации REST API), события (10.01.06 Шаблон спецификации Producer (Kafka, RabbitMQ)) или экраны — и нужна согласованная модель данных;
- требуется ревью с DBA (индексы, партиции, блокировки) или security (PII, шифрование, retention);
- домен регламентирован: аудит, soft delete, версионирование записей, compliance;
- миграция legacy или декомпозиция монолита — нужно явно описать границу «эта БД / не эта БД».
Не подходит или требует дополнения, если:
- нужна enterprise data architecture целиком (master data, DWH, enterprise bus) — спека покрывает только persistence данного сервиса;
- схема полностью генерируется из ORM без бизнес-семантики — добавьте data dictionary и правила жизненного цикла, иначе спека бесполезна на ревью;
- NoSQL/document store — используйте подраздел §3.5.1 (коллекция, ключ документа, JSON-schema, индексы, версия схемы); «схемы нет» не освобождает от контракта;
- event sourcing — используйте §3.5.2 (write model, event store, snapshots); классическая PDM одной таблицы на агрегат недостаточна;
- выбор СУБД, sharding, CQRS, read replicas — решение в 10.01.13 Шаблон архитектурного решения (ADR); в спеке — следствия для write-side и read-side (§3.2, §3.5);
- latency, backup, GDPR, классификация данных — полный текст в 10.01.12 Шаблон нефункциональных требований (NFR); в спеке — ссылки и поля, которых это касается.
Входные условия: границы сервиса согласованы (03.01.03 Декомпозиция системы на подсистемы и модули), сущности домена названы единообразно (10.01.14 Шаблон глоссария и словаря данных), функциональные требования и сценарии (UC/story) описывают операции чтения/записи.
3. Структура документа
Скопируйте блок в Confluence, Git (DDL + markdown) или RM-инструмент. Поля с пометкой обяз. нужны для sign-off; да* — обязательно при выполнении условия в скобках; остальные — по контексту. Логическая модель (LDM) и физическая (PDM) могут быть в одном документе или в связанных файлах с общим ID.
Минимальный срез (MVP) — для простого CRUD без PII, событий и сложного lifecycle достаточно §3.1, §3.2, §3.4, §3.5 (базовые строки), §3.6, §3.11, §3.15. Остальные разделы — «не применимо» или по мере появления требований. Не заполняйте все 15 подразделов «для галочки».
| Уровень | Разделы | Типичный контекст |
|---|---|---|
| MVP | 3.1, 3.2, 3.4, 3.5, 3.6, 3.11, 3.15 | CRUD, нет PII, нет async |
| Standard | MVP + 3.7, 3.8, 3.9, 3.10 | Workflow, PII, индексы под нагрузку |
| Full | все, включая 3.12 и 3.5.2 при event sourcing | Events, integrations, compliance |
3.1. Метаданные
| Поле | Обяз. | Что писать |
|---|---|---|
| ID | да | Уникальный идентификатор по схеме DB-SPEC-{контекст}-v{N}, напр. DB-SPEC-LEAVE-v2. Тот же ID — в матрице трассировки, migration scripts и test data — 10.01.15 Шаблон матрицы трассировки. |
| Сервис / bounded context | да | Имя сервиса, владелец (data owner), команда. |
| Schema / database name | да* | Имя схемы или БД в целевой СУБД. *Если СУБД ещё не выбрана — «TBD» + ссылка на ADR; статус Approved допустим только с открытым action в ADR на выбор СУБД. Пока schema = TBD, поля PDM с типами конкретной СУБД остаются в Draft/Review — не маскируйте неопределённость статусом Approved. |
| Версия, статус, дата | да | Draft → Review → Approved; автор последнего изменения. |
| СУБД и окружения | да | PostgreSQL 15, dev/stage/prod; отличия между окружениями, если есть. |
| Upstream: BRD / SRS / ADR | да | SRS-REQ-xxx, ADR-042 (выбор СУБД, outbox, idempotency). |
| Связанные спеки | да | REST/SOAP API ID, Producer/Consumer ID, NFR ID — ссылки, не дублирование. |
3.2. Scope и контекст
| Поле | Обяз. | Что писать |
|---|---|---|
| Scope (внутри) | да | Какие сущности и операции persistence покрывает этот сервис; при CQRS — write-side и read-side (проекции, materialized views) внутри этого сервиса или явно «read models — см. ADR-xxx». |
| Excluded scope | да | Что не в этой БД: данные других сервисов, справочники-референсы, DWH. Read-БД другого сервиса или BI-реплика — excluded: контракт через API/events, не «наша schema». При legacy shared DB — anti-pattern: «мы читаем чужие таблицы» → excluded + план миграции на контракты. |
| Зависимости от внешних данных | нет | Справочники, read-only реплики, cache; откуда берётся, как обновляется, что при устаревшем значении. |
| Service DB boundary | да | Правило: «другие сервисы не имеют FK/direct SQL к нашим таблицам»; доступ только через API/events. |
3.3. Концептуальная модель
| Поле | Обяз. | Что писать |
|---|---|---|
| ER-диаграмма / UML | да | Ключевые сущности и связи; достаточно для обсуждения с бизнесом. |
| Глоссарий терминов | да | Ссылка на 10.01.14 Шаблон глоссария и словаря данных или встроенная таблица: термин → сущность/атрибут. |
3.4. Логическая модель (LDM)
| Поле | Обяз. | Что писать |
|---|---|---|
| Сущности | да | Имя, описание, бизнес-идентификатор (natural key) vs surrogate key. |
| Атрибуты | да | Имя, тип на уровне домена (строка, деньги, enum), обязательность, семантика. |
| Связи и кардинальность | да | 1:1, 1:N, M:N; для M:N — промежуточная сущность. |
| Бизнес-правила на уровне LDM | да | Инварианты без привязки к СУБД: «у сотрудника не более одной активной заявки того же типа на пересекающийся период». |
| Temporal / effective dating | нет | Если домен требует версионность по времени — valid_from / valid_to, правило перекрытия периодов. |
Пример логической схемы сервиса отпусков. Сотрудник ссылается на руководителя той же таблицей. Заявка обязана иметь тип и автора. Согласование — отдельная запись: одну заявку могут вернуть и согласовать повторно. Остаток дней — на пару «сотрудник, тип, год», а не поле в заявке.
- iduuidPK
- emailvarcharUK NN
- full_namevarcharNN
- manager_iduuid
- iduuidPK
- codevarcharUK NN
- titlevarcharNN
- iduuidPK
- employee_iduuidNN
- leave_type_iduuidNN
- yearintNN
- days_remainingdecimalNN
- iduuidPK
- employee_iduuidNN
- leave_type_iduuidNN
- start_datedateNN
- end_datedateNN
- statusvarcharNN
- iduuidPK
- leave_request_iduuidNN
- approver_iduuidNN
- decisionvarcharNN
- decided_atdatetime
Правило «не больше одной активной заявки того же типа на пересекающиеся даты» на линиях не рисуется: это ограничение в тексте LDM и в CHECK или в сервисе, не кардинальность 1:1.
3.5. Физическая модель (PDM)
| Поле | Обяз. | Что писать |
|---|---|---|
| Объекты | да | Таблица/коллекция, колонки, типы СУБД, PK, FK, UNIQUE, CHECK. |
| Naming convention | да | snake_case в БД ↔ camelCase в API; enum в БД — UPPER_SNAKE, в API — camelCase. Полная таблица mapping — §3.6. |
| PK и стратегия ID | да | UUID v7 / serial / snowflake; обоснование для интеграций и sharding. |
| FK и delete/update behavior | да | RESTRICT / CASCADE / SET NULL для каждой связи внутри сервиса. |
| External references (без FK) | да* | ID из внешнего домена (IAM, MDM): тип, допустимые значения, валидация при записи, поведение при «битой» ссылке. *Если есть поля-ссылки на чужие bounded context. |
| Индексы | да | Состав, тип; обоснование под сценарии из API/use case (фильтр, сортировка, join), не «на всякий случай». |
| Read models / projections | нет | Таблицы read-side при CQRS этого сервиса: источник, частота обновления, допустимый lag; детали архитектуры — в ADR. |
| Партиционирование / sharding | нет | Критерий партиции, если объёмы или NFR это требуют. |
| Multi-tenancy | нет | tenant_id, RLS-политика, изоляция данных — для B2B SaaS. |
3.5.1. Document store (NoSQL) — альтернатива табличной PDM
Заполняйте вместо строк таблицы §3.5, если СУБД — document/key-value store:
| Поле | Обяз. | Что писать |
|---|---|---|
| Коллекция / bucket | да | Имя, назначение, владелец. |
| Ключ документа | да | _id, составной ключ, shard key. |
| JSON-schema / обязательные поля | да | Версия схемы, required, типы, вложенность, max depth. |
| Индексы | да | Поля индекса, partial/filtered — с привязкой к API-сценариям. |
| Эволюция документов | да | Backward-compatible изменения, миграция старых документов, default для отсутствующих полей. |
3.5.2. Event sourcing — альтернатива классической PDM
Заполняйте вместе с базовыми строками §3.5 или вместо «одна таблица = агрегат», если persistence построена на event store:
| Поле | Обяз. | Что писать |
|---|---|---|
| Write model | да | Таблицы command-side: текущее состояние агрегата, версия, optimistic lock; что не дублируется из event log. |
| Event store | да | Таблица/топик событий: aggregate_id, sequence, event_type, payload schema version, timestamp; append-only, уникальность (aggregate_id, sequence). |
| Snapshots | нет | Периодичность, формат, когда пересчитывать aggregate без replay всей истории. |
| Projections / read models | нет | Таблицы, строящиеся из event stream: источник, lag, идempotency при replay. |
| Upcasting / schema migration | нет | Как мигрировать старые версии payload в event log. |
3.6. Data dictionary (обязательный блок)
Теория метаданных и словаря данных — 03.03.03 Словарь данных (описание); канон имён и enterprise-глоссарий — 10.01.14 Шаблон глоссария и словаря данных. В DB-spec — service-level projection: поля, которые реально есть в схеме этого сервиса, с PII и канонической таблицей mapping API ↔ БД. Не дублируйте второй enterprise glossary и не заводите вторую mapping-таблицу в §3.12.
| Поле | Обяз. | Что писать |
|---|---|---|
| Таблица полей | да | На каждое поле: имя (LDM + PDM), описание, тип, длина/precision, nullable, default, enum/справочник, PII/чувствительность, data owner, пример значения. |
| Источник данных | нет | Поле заполняется пользователем, приходит из API, из события, вычисляется, snapshot из MDM. |
| Справочник / MDM-копия | нет | Для кодов из внешнего справочника: храним только ID или denormalized snapshot; политика refresh — детали в §3.2; здесь — только impact на поля. |
| Маппинг API ↔ БД (канон) | да* | Единственная полная таблица: колонка PDM ↔ JSON-поле REST/SOAP; расхождения nullable, enum casing и имён — явно. §3.12 ссылается сюда, не дублирует. *Если API в том же релизе. |
3.7. Ограничения и бизнес-правила
| Поле | Обяз. | Что писать |
|---|---|---|
| Integrity constraints | да | UNIQUE, CHECK, FK; cross-field rules. |
| Conditional uniqueness | да* | Инварианты с условием (partial unique): формулировка на LDM, где enforce — partial index в БД vs проверка в коде. *Если natural key или dedup с фильтром по статусу. |
| Enforcement level | да | Что enforced в БД vs в коде приложения — с обоснованием (производительность, гибкость, legacy). |
| Idempotency storage | нет | Таблица/ключ для идempotent POST (связь с 10.01.04 Шаблон спецификации REST API): TTL, unique constraint, cleanup. |
| Ссылки на BR | нет | BR-047 из SRS/UC; правило не дублировать текстом SRS целиком. |
3.8. Жизненный цикл и аудит
| Поле | Обяз. | Что писать |
|---|---|---|
| Состояния записи | да* | Enum статусов и граф допустимых переходов (таблица from → to или state diagram); CHECK на enum не заменяет контроль переходов. *Обязательно, если у сущности есть поле status/state; иначе «не применимо». При ≥3 статусах и ветвлении — state machine обязателен (03.02.04 Диаграмма состояний (State Machine Diagram)). |
| Создание / изменение / удаление | да | Hard vs soft delete; правила выборок («по умолчанию deleted_at IS NULL»); erasure vs retention для PII. |
| Аудит | да | created_at, updated_at, updated_by, version; что пишется в audit log vs в основную таблицу. |
| Версионирование | нет | Optimistic locking, history table — если требуется. |
3.9. Объёмы и нагрузка
| Поле | Обяз. | Что писать |
|---|---|---|
| Начальный объём и рост | да | Строк на сущность, прогноз на 12–24 мес. |
| Hot paths | да | Частые операции чтения/записи из API/UC; основа для индексов и партиций. |
| SLA на запросы | нет | Ссылка на NFR (p95 latency); не дублировать полный NFR-документ. |
3.10. Безопасность и compliance
| Поле | Обяз. | Что писать |
|---|---|---|
| Классификация данных | да | Public / internal / confidential / PII; пометка в data dictionary. |
| Шифрование | нет | At rest / in transit; маскирование в логах и репликах. |
| Retention и purge | да* | Срок хранения, job архивации/удаления; право на erasure vs retention. *Если есть PII или регуляторика — см. также 08.06 Юридические и регуляторные требования РФ (PCI-DSS). |
| Row-level security | нет | Если применимо — правило, tenant_id и роли (10.01.11 Шаблон ролевой модели). |
3.11. Миграции и версионирование схемы
| Поле | Обяз. | Что писать |
|---|---|---|
| Инструмент | да | Flyway / Liquibase / ручные скрипты; каталог миграций в репозитории (07.05 Системы контроля версий (Git) для документации). |
| Стратегия rollout | да | Порядок деплоя: expand → migrate data → contract; breaking vs non-breaking; связка с CI/CD (07.06 CICD и конвейеры — влияние на требования). Изменения breaking-схемы — через change control (02.05.02 Управление изменениями (Change Control Board)). |
| Обратная совместимость | да | Совместимость с текущими версиями API и consumers на период rolling deploy. |
| Rollback | да | Что откатывается автоматически, что требует runbook. |
3.12. Интеграционные точки
Summary-раздел: детали mapping API — только в §3.6; детали refresh внешних данных — в §3.2.
| Поле | Обяз. | Что писать |
|---|---|---|
| Mapping API ↔ БД | да* | Ссылка на таблицу §3.6 + при необходимости: aggregate root ↔ endpoint group, nested DTO vs flat table. *Если API в том же релизе. |
| Event ↔ таблицы / outbox | нет | Payload события, outbox table, idempotency keys; полный контракт producer — 10.01.06 Шаблон спецификации Producer (Kafka, RabbitMQ). |
| Consumer ↔ таблицы (inbox/dedup) | нет | Inbox, processed, dedup keys при записи из событий; idempotency и порядок обработки — 10.01.07 Шаблон спецификации Consumer (Kafka, RabbitMQ). |
| Batch / ETL | нет | Если сервис отдаёт или принимает bulk — ссылка на 10.01.10 Шаблон описания Airflow-триггеров и автоматических процессов. |
| Источник истины | да* | Summary: БД vs event log при event-driven; eventual consistency. Детали refresh MDM/справочников — §3.2. *Если есть асинхронные интеграции или реплики MDM. |
3.13. Открытые вопросы, допущения, история
| Поле | Обяз. | Что писать |
|---|---|---|
| Assumptions | нет | «Справочник отделов реплицируется nightly из MDM». |
| Открытые вопросы | нет | Нерешённое до Approved (напр. «нужен ли partial index по status»). |
| История изменений | да | Версия, дата, автор, impact на API/migrations. |
3.14. Приложения
| Поле | Обяз. | Что писать |
|---|---|---|
| DDL-черновик | нет | SQL или dbdiagram; не заменяет data dictionary. |
| Sample queries | нет | 2–5 запросов под ключевые use case / API endpoints. |
| Ожидания для test data (QA) | нет | Какие сущности, статусы и ID обязаны быть в fixtures для сценариев из stories; ссылки TD-* в 10.01.15 Шаблон матрицы трассировки. |
| Диаграмма | нет | dbdiagram, Mermaid ER, экспорт из 07.04 Инструменты моделирования (Sparx EA, Lucidchart, draw.io). |
3.15. Чеклист качества перед sign-off
Рецензирование артефакта — 08.04 Рецензирование и инспекции (техники Фейгана). Перед передачей в разработку сверьтесь также с 10.04 Чеклист аналитика перед стартом разработки.
- У каждой сущности есть PK, стратегия ID и natural key (если есть).
- Data dictionary заполнен для всех колонок, PII помечены; канон имён согласован с 10.01.14 Шаблон глоссария и словаря данных.
- Индексы привязаны к сценариям из API/UC, а не «на всякий случай».
- Nullable обоснован; нет «nullable на всякий случай» без правила агрегации в API.
- External references без FK задокументированы: валидация и поведение при нарушении ссылочности.
- Conditional uniqueness: условие на LDM и место enforce (partial index vs код) согласованы.
- Lifecycle: граф переходов статусов зафиксирован; enum-only без state machine — осознанное решение.
- Soft delete с правилами выборок задокументирован.
- FK не выходят за границу сервиса (нет coupling между микросервисами через БД).
- Mapping API ↔ БД — одна таблица в §3.6, согласована с 10.01.04 Шаблон спецификации REST API в том же релизе.
- Retention, purge и erasure для персональных данных указаны или явно «не применимо».
- Миграции: breaking/non-breaking, rollback, совместимость с API.
- Трассировка
DB-SPEC-*→ SRS/stories → migration → test data заполнена.
4. Пример заполнения
Сокращённый фрагмент для сервиса leave-service (HR Portal, данные условны).
Метаданные: DB-SPEC-LEAVE-v2 · leave-service · schema leave · PostgreSQL 15 · Approved · v2.1, 2026-03-15 · Upstream: SRS-REQ-038, SRS-REQ-039, ADR-042 (outbox) · API: API-LEAVE-001, API-LEAVE-003 · Producer: PROD-LEAVE-001 · NFR: NFR-AUDIT-003, NFR-DATA-007
Scope. Хранение заявок на отпуск, истории статусов, outbox для событий. Excluded: баланс отпусков (сервис balance-service), полный справочник типов отпуска (MDM), read-replica для BI. Boundary: прямой доступ к schema leave только у leave-service.
LDM (фрагмент). Сущность Заявка на отпуск (LeaveRequest): идентификатор, сотрудник (employee_id, external ref IAM), руководитель согласования (manager_id, external ref IAM), тип отпуска (код из MDM), период, статус, комментарий. Связь 1:N с Историей статуса (LeaveRequestStatusHistory). Natural key для dedup: (employee_id, leave_type_code, start_date, end_date) где status ∉ {CANCELLED, REJECTED} — conditional uniqueness.
PDM (фрагмент).
| Таблица | Назначение |
|---|---|
leave_request | Основная заявка |
leave_request_status_history | Аудит переходов статусов |
outbox_event | Transactional outbox (ADR-042) |
PK: leave_request.id — UUID v7. FK: status_history.request_id → leave_request.id ON DELETE RESTRICT. External ref (без FK): employee_id, manager_id → IAM; валидация через IAM API при submit; при 404 — отклонение заявки.
Conditional uniqueness: partial unique index uq_leave_request_active ON (employee_id, leave_type_code, start_date, end_date) WHERE status NOT IN ('CANCELLED', 'REJECTED') AND deleted_at IS NULL.
Индексы:
idx_leave_request_employee_statusON(employee_id, status)WHEREdeleted_at IS NULL— список заявок сотрудника (GET /leave-requests,API-LEAVE-001).idx_leave_request_manager_queueON(manager_id, status)WHEREstatus = 'PENDING_APPROVAL'— очередь руководителя (API-LEAVE-003).
Data dictionary (фрагмент, канон mapping — §3.6):
| Поле (PDM) | API (camelCase) | Тип | Nullable | PII | Описание |
|---|---|---|---|---|---|
employee_id | employeeId | UUID | нет | да | External ref IAM; без FK |
manager_id | managerId | UUID | нет | да | Руководитель на момент submit; из IAM org-tree |
leave_type_code | leaveTypeCode | varchar(32) | нет | нет | Snapshot кода из MDM; refresh при submit |
status | status | enum | нет | нет | БД: DRAFT, PENDING_APPROVAL, APPROVED, REJECTED, CANCELLED; API: draft, pendingApproval, … |
deleted_at | — | timestamptz | да | нет | Soft delete; не отдаётся в API |
Жизненный цикл. Soft delete: deleted_at + deleted_by. Все SELECT по умолчанию с deleted_at IS NULL. CHECK — только допустимые значения enum; переходы — в доменном сервисе.
Граф переходов (leave_request.status):
| From | To | Условие / действие |
|---|---|---|
| — | DRAFT | создание заявки |
DRAFT | PENDING_APPROVAL | submit сотрудником |
DRAFT | CANCELLED | отмена автором |
PENDING_APPROVAL | APPROVED | approve руководителем |
PENDING_APPROVAL | REJECTED | reject руководителем |
PENDING_APPROVAL | CANCELLED | отмена до решения |
Объёмы. ~50 000 заявок/год, рост 10%/год; hot path — выборка очереди руководителя и списка по employee_id.
Retention. PII в leave_request — 5 лет после увольнения (NFR-DATA-007); purge job ежемесячно; erasure по запросу — anonymize employee_id/manager_id.
Миграции. V2_1__add_manager_id_index.sql — non-breaking, expand-only; деплой до API v1.3.
Event mapping (§3.12 summary). После INSERT/UPDATE статуса → запись в outbox_event (event_type=leave.request.submitted, payload JSON по PROD-LEAVE-001); idempotency key = request_id + status + updated_at. Mapping API ↔ БД — таблица выше, §3.12 не дублирует.
Test data (§3.14). TD-LEAVE-001: заявка в PENDING_APPROVAL для сценария approve; TD-LEAVE-002: две заявки одного сотрудника для проверки conditional uniqueness.
Трассировка: US-0238, US-0247 → DB-SPEC-LEAVE-v2 → test data TD-LEAVE-* → migration V2_1.
5. Связанные артефакты
На входе (upstream)
| Артефакт | Связь |
|---|---|
| Vision & Scope, BRD, SRS | Что хранить и зачем — сущности домена, отчётность, регуляторика — 04.01 Форматы документов (Vision&Scope, BRD, SRS, FRD) |
| 10.01.01 Шаблон User Story / 10.01.02 Шаблон Use Case | Операции чтения/записи, postconditions, статусы |
| 10.01.14 Шаблон глоссария и словаря данных | Канонические имена сущностей и атрибутов |
| 10.01.13 Шаблон архитектурного решения (ADR) | Выбор СУБД, outbox, CQRS, sharding, event sourcing |
| 10.01.11 Шаблон ролевой модели | Row-level доступ, audit updated_by |
| ER-диаграмма / LDM (черновик) | 03.03.01 ER-диаграммы (сущность-связь) |
На выходе (downstream)
| Артефакт | Когда создавать |
|---|---|
| 10.01.04 Шаблон спецификации REST API / 10.01.05 Шаблон спецификации SOAP API | DTO и поля согласованы с data dictionary; mapping — §3.6 |
| 10.01.06 Шаблон спецификации Producer (Kafka, RabbitMQ) / 10.01.07 Шаблон спецификации Consumer (Kafka, RabbitMQ) | Outbox, payload, idempotency keys; inbox/dedup tables у consumer |
| 10.01.12 Шаблон нефункциональных требований (NFR) | Retention, backup, RPO/RTO, latency — по ссылке из спеки |
| DDL и migration scripts | Реализация PDM; версии синхронны со спекой |
| Test data / fixtures | QA по сценариям из stories и API; поле §3.14 + матрица |
| 10.01.15 Шаблон матрицы трассировки | FR/story → DB-SPEC-* → migration → test |
Типичный порядок работы аналитика
- Выделить сущности из SRS/UC и глоссария → концептуальная ER.
- Согласовать LDM с бизнесом (правила, lifecycle, natural keys, conditional uniqueness).
- Детализировать PDM с DBA: типы, индексы под API-сценарии, FK внутри сервиса, external ref без FK; при event sourcing — §3.5.2.
- Заполнить data dictionary и mapping API ↔ БД в §3.6 параллельно с API-спекой (или reverse impact, если API уже зафиксирован раньше).
- Review с dev, DBA, security (08.04 Рецензирование и инспекции (техники Фейгана)); зафиксировать миграции и трассировку.
- При изменении API или BR — impact analysis на схему (02.05.02 Управление изменениями (Change Control Board) при формальном CCB; не путать с 02.05.02 Управление приоритетами в условиях изменчивости — другая заметка).
6. Связи с другими разделами базы
- ER-диаграммы и нотация сущность-связь — 03.03.01 ER-диаграммы (сущность-связь)
- Логическая vs физическая модель, нормализация — 03.03.02 Логическая и физическая модель данных
- Словарь данных: теория и метаданные — 03.03.03 Словарь данных (описание)
- Bounded context и владение данными — 03.06.02 Основы Domain-Driven Design
- Декомпозиция сервисов и границы persistence — 03.01.03 Декомпозиция системы на подсистемы и модули
- SQL и базовые операции для аналитика — 07.01 Базы данных и SQL на уровне аналитика
- Диаграмма состояний для lifecycle записи — 03.02.04 Диаграмма состояний (State Machine Diagram)
- Асинхронные события и eventual consistency — 03.05.04 Асинхронное взаимодействие (очереди, Kafka, Events)
- Event-Driven Architecture и outbox — 03.05.06 Event-Driven Architecture
- НФТ: retention, backup, классификация — 08.02 Нефункциональные требования (НФТ) — классификация и стандарты
- Регуляторика и compliance РФ — 08.06 Юридические и регуляторные требования РФ (PCI-DSS)
- Кибербезопасность и hardening БД — 08.07 Основы кибербезопасности для системного аналитика
- Git для DDL и migrations as code — 07.05 Системы контроля версий (Git) для документации
- CI/CD и порядок деплоя миграций — 07.06 CICD и конвейеры — влияние на требования
- Рецензирование спецификаций — 08.04 Рецензирование и инспекции (техники Фейгана)
- Трассировка FR → design → test — 02.03.04 Трассировка требований (концепция)
- Чеклист перед стартом разработки — 10.04 Чеклист аналитика перед стартом разработки
7. Источники и дополнительные материалы
Ссылки приведены на момент публикации; при переносе в рабочий контур перепроверьте актуальность.
Книги и стандарты
- ISO/IEC/IEEE 29148:2018 — Systems and software engineering — Life cycle processes — Requirements engineering (контекст SRS и traceability) — https://ieeexplore.ieee.org/document/8559686
- IEEE Guide to Software Requirements Specifications (IEEE 830, устаревший ориентир по структуре SRS; актуальный контекст — ISO/IEC/IEEE 29148) — https://standards.ieee.org/standard/830-1998.html
- Martin Fowler — Patterns of Enterprise Application Architecture (Bounded Context, ownership данных) — https://martinfowler.com/books/eaa.html
- DAMA-DMBOK — Data Management Body of Knowledge (data dictionary и metadata) — https://www.dama.org/cpages/body-of-knowledge
Статьи и практики
- Microsoft Azure Architecture Center — Data guide (моделирование, границы данных) — https://learn.microsoft.com/en-us/azure/architecture/data-guide/
- OWASP — Database Security Cheat Sheet (PII, access, hardening) — https://cheatsheetseries.owasp.org/cheatsheets/Database_Security_Cheat_Sheet.html
Спецификации и инструменты
- PostgreSQL Documentation — DDL / Schemas — https://www.postgresql.org/docs/current/ddl-schemas.html
- dbdiagram.io — Data Definition Language & diagram-as-code — https://dbdiagram.io/docs
- DBML — Database Markup Language (syntax для dbdiagram) — https://dbml.dbdiagram.io/home
- Flyway — Schema migration practices — https://documentation.red-gate.com/fd
- Liquibase — Database migration — https://docs.liquibase.com/