Опросник по архитектуре хранения
Квинтеты, обычные таблицы или комбинация
Механический опросник к меморандуму «Квинтеты против традиционных таблиц». Тринадцать вопросов о проекте — в ответ три оценки: сколько баллов набирает каждый способ хранения и сколько человеко-часов уйдёт на разработку такого решения.
Квинтеты — модель хранения самого Интеграма. Структура данных в ней описывается такими же записями, как сами данные, поэтому поля, справочники и связи добавляются без изменения схемы базы и без релиза. Опросник — проверка, а не реклама: он честно показывает вопросы, где квинтеты проигрывают обычным таблицам, и считает оба варианта по одной шкале.
Часы — на разработку, среднее для такого проекта. Сколько человеко-часов уйдёт, чтобы решение заработало: сама разработка, настройка под объём и нагрузку, отчётные механизмы, тиражирование и изменения структуры первого года. Сопровождение годами, железо и календарный срок сюда не входят — за сколько недель это сделают, зависит от числа исполнителей.
Считается только разница между подходами. Общая часть — сам сервер, интерфейсы, обучение пользователей, ведение самих данных — одинакова и в часы не входит. Ноль значит «здесь этот вариант базовый, лишней работы нет», а не «работы нет вообще».
Три варианта. Квинтеты — всё в одной квинтетной таблице, векторы в типизированной боковой таблице pgvector. РСУБД — обычные таблицы с колонками, DDL, программист или DBA. Комбинация — часть данных в обычных таблицах (гео с PostGIS, гигантская таблица, витрина для внешнего SQL), остальное в квинтетах.
Почему комбинация оценена ниже и стоит дороже. Она по определению означает две формы хранения, два набора правил и два пути сопровождения. В баллах она платит треть веса каждого вопроса; штраф снимается только там, где один из чистых вариантов вопрос категорически не тянет (набрал не больше трети веса) — тогда комбинация и есть ответ, и берёт полный балл сильного варианта. Потолок её шкалы — 90. В часах она по каждому вопросу берёт трудозатраты более подходящего хранилища, но добавляет разовую надбавку за стык двух контуров.
Правило нуля. Ответ, принёсший варианту 0 баллов, — блокер: вариант не подходит независимо от суммы и часов. Комбинация блокер не наследует, она уводит проблемные данные в подходящее хранилище. Баллы и часы — оценка составителя по числам меморандума, автором не подтверждена.
Откуда взяты часы
- Пересчёт денег меморандума в часы по его же ставке senior-программиста 2 630 ₽/час (раздел 2.5): сущность с формами, правами и отчётами в кастоме — 125–175 тыс. ₽, то есть ≈55 часов; мелкая правка структуры — ≈10 часов; разбор «почему тормозит» — 4–8 часов.
- Допущения составителя: заведение сущности в квинтетах — 4 часа аналитика, мелкая правка — 1 час; изменения структуры считаются за первый год работы; в диапазоне объёма берётся середина (10 млн и 300 млн записей); тиражирование считается на 20 экземпляров и на 200 арендаторов.
- Сопровождение годами в часы не входит: опросник оценивает разработку, а не стоимость владения. Поэтому у отчётных механизмов стоит цена их сборки — накопитель в конструкторе против таблиц итогов, которые в обычной базе пишет программист.
- Надбавка за комбинацию — 56 часов разово: общий справочник, перенос данных между контурами, сквозные права и отчёты поверх обоих хранилищ.
- Перекос без своего SQL-специалиста: +80 часов к РСУБД — четыре захода к подрядчику по 20 часов вместе с постановкой, ожиданием, приёмкой и переделкой. Допущение составителя; сами 120 часов на разработку цепочки считаются отдельно и остаются у обоих подходов.
- Железо в часы не переводится и в счёт не входит. Где оно значимо, число стоит в пояснении: дельта диска у квинтетов — 48 ₽/мес на миллион записей, 4 774 ₽/мес на 100 млн, 47 737 ₽/мес на миллиард (SSD 8,99 ₽/ГБ/мес, раздел 2.5).
- Часы — порядок величины для разговора, а не смета. Ни одна из этих оценок не замерена.
Отметьте по одному ответу в каждом вопросе и сложите подписанные баллы и часы: с включённым JavaScript страница считает сумму и вердикт сама, без него опросник работает как бумажный бланк.
1. Сколько записей наберёт главная таблица проекта за 3–5 лет? вес 12
Сделки, документы, транзакции; справочники и статусы не считать. Часы — подготовка базы к такому объёму.
2. Как часто меняется структура данных? вес 12
Новые сущности, реквизиты, связи — после запуска. Часы — работа на эти изменения за первый год.
3. Кто будет менять структуру? вес 8
Часы — накладные на постановку задачи и приёмку сверх самой работы.
4. Сколько пользователей работают одновременно? вес 4
Часы — настройка сервера под такое число людей.
5. Насколько неровная нагрузка? вес 4
Часы — проектирование разгрузки.
6. Что делают с данными в отчётах? вес 12
Часы — сделать так, чтобы такие отчёты открывались быстро.
7. Насколько сложны сами запросы — нужны ли цепочки, вложенность, рекурсия? вес 8
Не про объём (это вопрос 6), а про устройство запроса: запрос как источник другого запроса, обход иерархии на произвольную глубину, сопоставление многие-ко-многим с вычислениями. Часы — сборка такой цепочки.
8. Нужен ли поиск и фильтр по любому полю? вес 8
Часы — завести индексы под такой поиск.
9. Как устроены связи между сущностями? вес 4
Часы — завести связи и научить систему по ним ходить.
10. Нужен ли векторный поиск? вес 4
Похожие документы, семантический поиск, память ИИ-агента.
11. Нужны ли геоданные? вес 8
Оценка составителя: в ядре нет геотипа и геоиндекса, меморандум это не замерял.
12. Кто ещё читает данные напрямую, мимо платформы? вес 8
BI по SQL, dbt, ORM, интеграторы, аудиторы.
13. Сколько экземпляров системы предстоит развернуть? вес 8
Часы — работа на один экземпляр, умноженная на их число.
Таблица баллов и часов целиком
Отметьте по одному ответу в каждом вопросе, сложите баллы и сложите часы. Подсвеченная клетка — комбинация без штрафа в баллах: один из чистых вариантов вопрос не тянет. Часы — человеко-часы на разработку, «—» значит «так не делается». Наведите курсор на пояснение, чтобы увидеть замеры, из которых взята оценка.
| № | Вопрос | Ответ | Баллы | Человеко-часы на разработку | Почему | ||||
|---|---|---|---|---|---|---|---|---|---|
| Кв. | РСУБД | Комб. | Кв. | РСУБД | Комб. | ||||
| 1 | Сколько записей наберёт главная таблица проекта за 3–5 лет? вес 12 | до 1 млн | 12 | 12 | 8 | 0 | 0 | 0 | Девять проектов из десяти сюда и попадают: ничего особенного делать не нужно ни там, ни там. |
| 1–100 млн | 10 | 12 | 8 | 8 ч | 0 | 0 | Объём заметный: у квинтетов данных на диске в 5–12 раз больше, под это настраивают бэкап и мониторинг. | ||
| 100 млн – 1 млрд | 5 | 12 | 8 | 60 ч | 8 ч | 8 ч | Большая база. Квинтетам нужна разбивка таблицы на части и обходные решения там, где обычная база обходится настройкой. | ||
| больше 1 млрд | 0 | 12 | 12 | 200 ч | 24 ч | 24 ч | Выше всего, что на квинтетах проверено. Такой объём — отдельный проект по хранению. | ||
| 2 | Как часто меняется структура данных? вес 12 | раз в год и реже | 4 | 12 | 12 | 4 ч | 55 ч | 4 ч | Одно изменение: в конструкторе его делает аналитик за полдня, в обычной разработке это задача программиста — формы, права, выкладка. |
| несколько раз в год | 9 | 8 | 5 | 7 ч | 85 ч | 7 ч | Четыре изменения за год — одно крупное и три мелких. В конструкторе это часы, в обычной разработке недели. | ||
| ежемесячно и чаще, сущности появляются постоянно | 12 | 3 | 12 | 24 ч | 300 ч | 24 ч | Структура меняется постоянно, около двенадцати раз за год. Каждое изменение в обычной базе — миграция, релиз и окно обслуживания. | ||
| 3 | Кто будет менять структуру? вес 8 | программист или DBA в штате либо на подряде | 4 | 8 | 5 | 0 | 0 | 0 | Исполнитель есть, лишних согласований не возникает. |
| аналитик или владелец процесса, без программиста | 8 | 1 | 8 | 0 | 20 ч | 0 | Каждое изменение придётся заказывать: объяснить, подождать, принять. В конструкторе владелец процесса меняет структуру сам. | ||
| 4 | Сколько пользователей работают одновременно? вес 4 | до 50 | 4 | 4 | 3 | 0 | 0 | 0 | Обычная рабочая группа: десятки людей на паре ядер, настраивать нечего. |
| 50–500 | 3 | 4 | 3 | 16 ч | 8 ч | 8 ч | Квинтетам нужно примерно вдвое больше памяти под ту же работу — сервер придётся настраивать вдумчивее. | ||
| больше 500 | 2 | 4 | 3 | 60 ч | 30 ч | 30 ч | Все данные лежат в одной таблице: тяжёлое обслуживание задевает сразу всех, под это планируют окна. | ||
| 5 | Насколько неровная нагрузка? вес 4 | ровная в течение дня | 4 | 4 | 3 | 0 | 0 | 0 | |
| предсказуемые пики до ×10 (отчётный день, конец месяца) | 3 | 4 | 3 | 16 ч | 20 ч | 16 ч | К отчётному дню данные готовят заранее: в конструкторе это настройка накопителя, в обычной базе — индексы и предрасчёт. | ||
| непредсказуемые пики ×10 и выше (акции, сезон, реклама) | 2 | 4 | 3 | 60 ч | 40 ч | 40 ч | Пики непредсказуемы: кроме предрасчёта нужен запас прочности и план обслуживания на случай, когда всё сойдётся разом. | ||
| 6 | Что делают с данными в отчётах? вес 12 | карточки, списки, поиск; отчёты редкие | 12 | 10 | 8 | 0 | 0 | 0 | Готовить нечего: и там, и там это обычная работа с данными, а поиск у квинтетов даже быстрее. |
| регулярные отчёты за период, сальдо, остатки | 8 | 12 | 8 | 8 ч | 60 ч | 8 ч | Нужен слой итогов. В конструкторе аналитик накликивает его за день; в обычной базе его пишет программист — таблицы итогов, пересчёт, выкладка. | ||
| тяжёлые отчёты по сырым данным, дашборд за год, любые срезы | 3 | 12 | 12 | 60 ч | 40 ч | 40 ч | Произвольная аналитика по сырым данным — не сильная сторона квинтетов: под неё заводят отдельную витрину, и это работа вне конструктора. | ||
| 7 | Насколько сложны сами запросы — нужны ли цепочки, вложенность, рекурсия? вес 8 | выборки, фильтры, списки — и только | 8 | 8 | 5 | 0 | 0 | 0 | Обоим подходам это ничего не стоит. |
| агрегаты и соединения: сводные отчёты по нескольким сущностям | 7 | 8 | 5 | 1 ч | 16 ч | 1 ч | Такой отчёт в конструкторе собирается за минуты: колонки выбирают из общего списка, связи между таблицами система проставляет сама, итог считает функция вроде СУММ или СЧЁТ. В обычной базе его пишут на SQL руками, и отдельной работой становится, где его показать, кому открыть и как выгрузить (разбор такого отчёта). | ||
| цепочки: запрос поверх запроса, рекурсивный обход иерархии, сопоставление многие-ко-многим с вычислениями | 8 | 7 | 5 | 6 ч | 120 ч | 6 ч | Здесь разрыв самый большой. В конструкторе отчёт вставляется в отчёт по имени, а обход дерева на любую глубину — это ссылка на соседний отчёт, а не код: цепочку собирает тот же аналитик, что ведёт структуру (массовое сопоставление каталогов сделано четырьмя запросами, без программиста). В обычной базе то же самое пишет человек, умеющий рекурсивный SQL, и живёт это вне платформы — права, публикация результата и версии становятся отдельной работой. | ||
| 8 | Нужен ли поиск и фильтр по любому полю? вес 8 | да, пользователи фильтруют по чему угодно | 8 | 4 | 5 | 4 ч | 40 ч | 4 ч | В квинтетах поиск по любому полю закрыт одним общим индексом; в обычной базе индекс заводят под каждую колонку. |
| нет, фильтры по 2–3 известным полям | 4 | 8 | 5 | 2 ч | 0 | 0 | Если ищут по двум-трём известным полям, общий индекс квинтетов — плата за возможность, которая не нужна. | ||
| 9 | Как устроены связи между сущностями? вес 4 | плоские записи, ссылок мало | 2 | 4 | 3 | 0 | 0 | 0 | Плоские записи читаются целиком — честного преимущества у квинтетов здесь нет. |
| много ссылок, иерархии, обход по связям | 4 | 3 | 3 | 0 | 48 ч | 0 | Связи и иерархии в квинтетах есть по устройству; в обычной базе под каждую пару сущностей заводят ключи и переписывают запросы. | ||
| 10 | Нужен ли векторный поиск? вес 4 | нет | 4 | 4 | 3 | 0 | 0 | 0 | |
| да | 3 | 4 | 3 | 24 ч | 24 ч | 24 ч | Векторы кладут в отдельную таблицу рядом — работы поровну у обоих подходов. | ||
| 11 | Нужны ли геоданные? вес 8 | нет | 8 | 8 | 5 | 0 | 0 | 0 | |
| точки и радиус вокруг точки | 3 | 8 | 5 | 40 ч | 8 ч | 8 ч | Точку и расстояние можно посчитать и в квинтетах, но без готового геоиндекса — руками в приложении. | ||
| полигоны, пересечения, маршруты | 0 | 8 | 8 | — | 24 ч | 24 ч | Полигоны и маршруты без специального геодвижка не делаются — для чистых квинтетов это стоп. | ||
| 12 | Кто ещё читает данные напрямую, мимо платформы? вес 8 | никто; отчёты через платформу и HTTP-выгрузку | 8 | 8 | 5 | 0 | 0 | 0 | Отчёты отдаёт сама платформа: Power BI подключается к ней за пять минут. |
| есть, читают редко (интегратор, аудитор раз в квартал) | 5 | 8 | 5 | 24 ч | 0 | 0 | Стороннему читателю нужны привычные таблицы с колонками — для квинтетов их придётся готовить отдельно. | ||
| постоянная синхронизация в хранилище, dbt, ORM | 2 | 8 | 8 | 160 ч | 20 ч | 20 ч | Внешние системы ждут обычных таблиц: над квинтетами придётся построить и поддерживать отдельную выгрузку. | ||
| 13 | Сколько экземпляров системы предстоит развернуть? вес 8 | один экземпляр, одна компания | 6 | 8 | 5 | 0 | 0 | 0 | Тиражировать нечего — сильная сторона квинтетов здесь не работает. |
| десятки экземпляров, у клиентов разная структура | 8 | 4 | 5 | 20 ч | 400 ч | 20 ч | Новый клиент со своей структурой в квинтетах — это настройка; в обычной базе у каждого своя схема и свои миграции. | ||
| SaaS на сотни арендаторов | 8 | 2 | 8 | 50 ч | 650 ч | 50 ч | Сотни клиентов на одной системе: для квинтетов это штатный режим, в обычной базе — отдельная большая работа по разделению клиентов и обновлению всех сразу. | ||
| Потолок баллов и самый трудоёмкий набор ответов | 100 | 100 | 90 | 688 ч | 1400 ч | 342 ч | у комбинации потолок баллов ниже ста по устройству шкалы, а к часам добавлена надбавка за стык | ||
| Перекос в цене | баллы не меняются | — | +80 ч | — | Ответ 3-б «аналитик без программиста» вместе с ответом 7-в «цепочки запросов» — перекос в цене РСУБД: собрать такую цепочку своими силами некому, её заказывают на стороне. К 120 часам самой разработки добавляются постановка, ожидание, приёмка и переделка при каждом изменении структуры — +80 чел.-ч. Квинтеты и комбинация собирают цепочку в конструкторе теми же людьми, которые ведут структуру, поэтому их часы не меняются. | ||||