ADR-0002 · Декомпозиция данных: три владельца в одной базе#
Статус: принят · 2026-09-22
Метод: D-07 v1.0 · шаблон ADR v1.2
Участники: руководитель ИТ ЦУУ, два аналитика, юрист
Учебная запись: часть прогона U-02, система вымышлена. Форма и рассуждение настоящие.
Контекст#
Вход — 00-context.md. Область решения — данные отчётного контура: подачи, квитанции, справочники, начисления.
Кто что пишет#
| Данные | Кто пишет | Пометка |
|---|---|---|
| Подача — документ, вложения, подпись | Приёмный контур | [схема] |
| Квитанция — ответ с юридической силой | Приёмный контур, в той же операции | [требования] |
| Справочники — коды упаковки, ставки, классификаторы | Регулятор. Мы принимаем выгрузку и не имеем права писать | [приказ] |
| Реестр актов утилизации | 310 утилизаторов, через тот же интерфейс | [приказ] |
| Начисления сбора | Расчётный контур — после выхода методики в декабре | [допущение] |
Реестр копий — обязательная строка записи#
И здесь первая особенность гринфилда: копий пока нет ни одной. Вопрос «сколько копий уже существует» на работающей системе — опрос; здесь он превращается в «сколько копий мы заведём», то есть в решение, а не факт. Реестр составлен как проектный, и его строки — обязательства, а не наблюдения.
| Куда | Как попадает | Доходит ли изменение | Можно ли удалить |
|---|---|---|---|
| Основное хранилище | Запись | — | Нет: принятый документ неизменяем по закону [приказ] |
| Вложения (объектное хранилище) | Запись при подаче | — | Нет, 5 лет [приказ] |
| Копия справочников | Выгрузка регулятора, версионированная | Приходит целиком, новой версией | Да, но оригинал не наш |
| Витрина для ведомства | Из основного, по расписанию | Догоняет за сутки [допущение] |
Да |
| Журнал операций | Запись при каждом действии | — | Нет: доказательство [требования] |
| Архивная копия | Резервное копирование | — | Нет |
Инвариант, который виден только из реестра: вердикт обязан быть воспроизводим через пять лет, а справочники к тому времени сменят десяток версий. Значит, подача обязана быть связана с версией справочника, по которой её проверяли, — иначе копия справочника не копия, а подмена.
Инварианты, требующие атомарности#
| Пара | Атомарность | Почему |
|---|---|---|
| Подача ↔ квитанция | Обязательна | Квитанция — юридический факт: либо есть обе, либо нет ни одной |
| Подача ↔ справочники | Не требуется | Чтение; версия фиксируется в подаче |
| Подача ↔ начисления | Не требуется | Начисление считается позже, из принятого документа |
| Подача ↔ реестр актов | Невозможна по построению | Акт сдаёт другая организация и имеет право сдать позже |
Дисквалификаторы#
| Что проверено | Сработал? | Что из этого следует |
|---|---|---|
| Запись в два места без единого источника порядка | Нет | Каждая часть имеет ровно одного писателя |
| Есть копия, из которой нельзя удалить, и в ней оседают данные, подлежащие стиранию | Да | В подаче есть ФИО и телефон ответственного лица — персональные данные. Документ подписан и неизменяем пять лет. Работа до разделения: контактное лицо выносится из подписываемого документа и хранится ссылкой в отдельной таблице, из которой удаление возможно |
| Линия рассекает класс защищаемых данных | Нет — после правки выше | Объёмы упаковки — коммерческая тайна; они целиком в одной части |
| Атомарность требуется поперёк линии | Нет | Единственная обязательная пара — подача и квитанция — остаётся внутри одной части |
| Отказ остаётся общим | Да, и принят сознательно | База одна: при её отказе ляжет всё. Ни одна сила разделения не требует физического разнесения — см. матрицу |
Что превратилось в работу до разделения: вынос контактного лица из подписываемого документа; фиксация версии справочника в подаче.
Рассмотренные варианты#
| Ось | Что записывать | Оставить как есть | Разделить владение внутри одной базы | База на сервис |
|---|---|---|---|---|
| Управление изменениями | Частей задевает изменение схемы | 3 [схема] |
1 — остальные через интерфейс [схема] |
1 [схема] |
| Отказоустойчивость | Частей ляжет с хранилищем | 3 | 3 — база та же | 1 |
| Масштабируемость | Разница требований, в порядках | Неприменимо: 0,17 запроса в секунду везде [расчёт] |
Неприменимо | Неприменимо |
| Управление соединениями | Потребителей против предела | 3 пула, предел не близок [расчёт] |
3 пула | 3 пула на три базы |
| Тип хранилища | Выигрыш от другого типа | — | — | Возможен для вложений [схема] |
| Режим защиты | Что обязывает класс и сколько мест держит | 1 место, режим целиком [режим] |
1 место [режим] |
2 места — режим удваивается [режим] |
| Интеграция: отношения | Связи через линию и чем оплачены | нет | Проверка строки соединяет подачу со справочником: 4 обращения на строку [расчёт] — оплачено чтением через интерфейс внутри той же базы |
То же соединение уезжает в приложение, 5 600 обращений на документ [расчёт] |
| Интеграция: копии | Сколько мест синхронизировать | 6 | 6 | 8 [схема] |
Нулевой вариант — «оставить как есть», одна схема и один владелец — взвешен и проиграл по одной оси: изменение схемы задевало бы все три части, а темп изменений у них разный. Справочники меняет регулятор, начисления ждут декабрьской методики, приёмный контур заморожен обещанием на год по ADR-0001.
Решение#
Разделить владение внутри одной базы. Три схемы, три единственных писателя:
| Владелец | Что пишет | Кто читает |
|---|---|---|
intake |
Подачи, вложения, квитанции, журнал операций | Все, через представления |
refs |
Копию справочников регулятора, версионированную | intake при проверке |
billing |
Начисления | Витрина |
Способ распространения изменений: справочники приходят целиком новой версией; подача связывается с версией на момент проверки и с ней же воспроизводится через пять лет. Начисления считаются из принятой подачи и версии справочника, а не из текущего состояния.
Физического разделения нет. Ступень «база на сервис» пропущена сознательно — см. обоснование.
Обоснование#
Перевесила одна сила — управление изменениями, и она же единственная, где варианты различаются: три части живут в разных темпах и меняются по разным поводам. Остальные пять сил разделения на этом кейсе не срабатывают вовсе: нагрузки нет, соединений мало, тип хранилища один, отказоустойчивость от логического разделения не растёт, а режим защиты от физического разделения ухудшается.
Силы интеграции оплачены так. Отношения в данных — чтением через интерфейс внутри одной базы: соединение остаётся в СУБД, в приложение не уезжает. Число копий не растёт: шесть до, шесть после.
Почему пропущена ступень «база на сервис». По правилу документа перепрыгивание требует объяснения; здесь его нет — ступень не пропущена, а не нужна: единственная сила, которая её оправдывает, — режим защиты, и она указывает в обратную сторону, потому что физическое разделение удваивает число мест, где лежит коммерческая тайна.
Последствия#
Что придётся построить: представления для чтения через границу владения; версионирование справочников с привязкой к подаче; отдельную таблицу контактных лиц с путём удаления; воспроизведение вердикта пятилетней давности по сохранённой версии справочника.
Что становится дороже. Воспроизводимость вердикта означает, что ни одна версия справочника не может быть удалена, пока жива хоть одна подача, проверенная по ней. Справочники становятся седьмой неудаляемой копией, и это следствие, которого в реестре на входе не было.
Чего лишаемся. Независимого отказа: база одна, ляжет всё сразу. Принято сознательно, альтернатива дороже.
Отрицательное последствие, которое стоит назвать прямо: владение объявлено, а технически доступ есть у всех — ровно то, чем оборачивается эта форма при ошибке. Единственная защита — права доступа на схемы, и они обязаны быть настроены до первой подачи, а не после.
Условия пересмотра#
- Появилась вторая копия справочников или второй их писатель.
- Начисления потребовали другого темпа изменений или другого типа хранилища.
- Регулятор потребовал локализации или отдельного аудита для части данных.
- Витрина перестала догонять за сутки — потребуется журнал как источник порядка.
- В подписываемом документе снова появились персональные данные.
Самая дорогая будущая граница#
Линия между intake и billing. Сегодня она проведена по предположению о декабрьской методике; если методика потребует пересчёта принятых документов задним числом, граница окажется не там, и переносить её придётся вместе с неизменяемыми данными.
Связанные ADR#
Зависит от ADR-0001: состав полей подачи заморожен обещанием на год, и вынос контактного лица обязан попасть в спецификацию до 1 октября, иначе он же станет сужением под годовым сроком.
Замечание 4 · На гринфилде реестр копий — не опрос, а обязательство#
D-07 называет реестр копий позвоночником решения и велит отвечать на вопрос «сколько копий уже существует» письменно. Здесь их нет ни одной: вопрос превращается в «сколько копий мы заведём».
Разница не косметическая. На работающей системе незаполненная строка означает «не нашли»; эвристика документа прямо говорит: «нет данных» здесь почти всегда значит «не нашли все копии». На гринфилде пустая строка означает «ещё не решили», и ошибка в ней не обнаруживается позже — она создаётся сейчас. Седьмая копия в этом ADR появилась не из опроса, а из следствия: версии справочников стали неудаляемыми после того, как решение было принято.
Это то же натяжение, что в замечании 1 к D-11, но у другого документа: вопрос, написанный как опрос существующего, на гринфилде становится проектным решением. Два документа подряд — это уже не свойство документа, а свойство набора.