13 февр. 2025 г.·7 мин

Хранимые процедуры vs визуальные рабочие процессы: где должна жить логика

Хранимые процедуры vs визуальные рабочие процессы: практическая инструкция, как решать, где держать логику — в базе, в drag-and-drop workflow или в пользовательском коде.

Хранимые процедуры vs визуальные рабочие процессы: где должна жить логика

Что на самом деле означает это решение

Бизнес-логика — это набор правил, которые решают, что разрешено, что происходит дальше и что должен сделать система, когда люди с ней работают. Это не сами данные. Это поведение: кто что может делать, при каких условиях и с какими побочными эффектами.

По сути спор «хранимые процедуры vs визуальные рабочие процессы» — о том, где эти правила должны находиться, чтобы их было легко менять, сложно сломать и понятно тем, кто отвечает за процесс.

Большинство команд в итоге имеют три возможных «места» для логики:

  • В базе данных (хранимые процедуры, триггеры, ограничения): правила выполняются рядом с данными. Это может быть быстро и согласованно, но сложнее для изменения теми, кто не специалист по базам данных.
  • В визуальных рабочих процессах (drag-and-drop): правила выражены как шаги и решения. Это часто легче читать, проверять и корректировать по мере изменения процесса.
  • В пользовательском коде (сервисы, приложения, скрипты): правила пишут на языке программирования. Это даёт максимум гибкости, но для изменений обычно требуется больше инженерной дисциплины и тестирования.

Выбор влияет на скорость работы сегодня и поддержку в долгосрочной перспективе. Если разместить логику не там, где надо, вы получите медленные релизы (каждая правка требует того единственного человека, кто знает базу), больше ошибок (правила дублируются в нескольких местах) и болезненную отладку (никто не понимает, почему запись была отклонена).

В системах обычно встречаются разные типы бизнес-логики. Примеры: валидация (обязательные поля, допустимые диапазоны), утверждения, ценообразование и скидки, уведомления и правила доступа.

Практичный взгляд: база хороша для защиты целостности данных, визуальные рабочие процессы хороши для выражения бизнес-процессов, а пользовательский код хорош, когда правило слишком уникально или сложно для чистой модели. Платформы вроде AppMaster занимают среднюю позицию: вы можете моделировать данные и затем реализовывать процесс в читаемой визуальной логике, не распыляя правила по множеству приложений.

Критерии: что вы оптимизируете

Это не вопрос вкуса. Это вопрос того, что вы хотите защитить: данные, людей, которые меняют систему, и скорость изменений.

Важные результаты

Назовите ключевые цели для проекта. Большинство команд балансируют между:

  • Корректностью: правила должны выполняться одинаково каждый раз, даже под нагрузкой.
  • Понятностью: новичок должен понимать, что происходит, без догадок.
  • Скоростью: логика должна выполняться быстро и, при необходимости, близко к данным.
  • Аудируемостью: нужно доказать, кто что изменил и когда правило выполнилось.
  • Частотой изменений: требования меняются раз в неделю, а не раз в год.

Редко удаётся максимально оптимизировать все пять. Сближение логики с базой повышает корректность и скорость, но снижает понятность для тех, кто не живёт в SQL.

Кто будет менять логику (и как часто)

Будьте честны о том, кто будет владеть изменениями каждый день. Правило, которое операционные сотрудники меняют каждую неделю, не должно требовать DBA для деплоя хранимой процедуры. В то же время правило, затрагивающее деньги, не должно быть редактируемым без проверки.

Думайте в терминах трения при изменениях. Если требования часто меняются, вы хотите место, где обновления безопасны, видимы и быстро попадают в прод. Визуальные инструменты (например, AppMaster’s Business Process Editor) хорошо работают, когда владельцы продукта и инженеры должны совместно работать над логикой без редактирования низкоуровневого кода. Если изменения редки и правило критично — более высокий уровень трения допустим.

Быстрый способ проверить владение:

  • Кто получает вызов, когда это ломается в 2:00 ночи?
  • Как быстро нужно патчить правило?
  • Нужны ли изменения с одобрением или бумажный след?
  • Зависит ли от правила несколько приложений?
  • Это в основном преобразование данных или бизнес-решение?

Учитывайте ограничения заранее. В некоторых отраслях требуются строгие права доступа, разделение обязанностей или детальные логи. Также думайте о лимитах доступа к данным: если только определённые сервисы должны видеть поля, это влияет на то, где логика может безопасно выполняться.

Когда логика должна быть в хранимых процедурах

Хранимые процедуры — это куски логики, которые выполняются внутри базы данных. В PostgreSQL их пишут на SQL (и иногда на PL/pgSQL). Вместо того чтобы приложение вытягивало строки, циклило их и записывало изменения назад, база выполняет работу там, где живут данные.

Хорошее правило простое: помещайте логику в базу, когда главная задача — защита данных и массовая обработка данных, а не координация людей или систем.

Где хранимые процедуры блистают

Они подходят для правил, которые должны всегда быть верны, независимо от того, какое приложение или интеграция работает с базой. Думайте о страховочных ограждениях, которые не пускают плохие данные.

Они также хороши для set-based обновлений, когда одним запросом можно безопасно и быстро обновить тысячи строк. Простые вычисления, касающиеся только данных — например подсчёт итогов или применение фиксированной формулы скидки — тоже могут жить здесь, если это сокращает круги и сохраняет согласованные результаты.

Пример: когда заказ помечают как paid, процедура может атомарно обновить статус заказа, уменьшить запас и записать аудиторную запись. Если один шаг падает, всё откатывается.

Когда хранимые процедуры становятся рискованными

Их сложнее тестировать и версионировать, чем код приложения, особенно если команда не рассматривает изменения в базе как полноценные релизы. Логика может стать «скрытой» от приложения, создавая связность, о которой вы узнаете позднее.

Отладка тоже сложнее. Ошибки появляются как сообщения базы с меньшим контекстом о действии пользователя. Новым участникам сложно разобраться, потому что правила разбросаны между приложением и базой, а логика в базе легко пропускается при онбординге.

Если вы используете визуальный инструмент для большей части логики, оставляйте хранимые процедуры для небольшого, стабильного ядра, которое должно выполняться рядом с данными. Всё остальное держите там, где это легче читать, трассировать и менять.

Когда логика лучше в визуальных рабочих процессах

Визуальные рабочие процессы — это пошаговая процессная логика, которую можно читать как чек-лист: когда происходит событие, выполните эти действия в этом порядке с понятными точками принятия решения. Это меньше про тяжёлые вычисления и больше про то, как работа передаётся между людьми, системами и временем.

Они хороши, когда вам важен общий уровень понимания. Если продукт, операции, поддержка и инженеры должны договориться о том, как работает процесс, визуальный рабочий процесс делает правила видимыми. Эта видимость часто отличает «система сломалась» от «процесс поменяли на прошлой неделе».

Они подходят для утверждений и проверок, маршрутизации, уведомлений и напоминаний, отложенных шагов (подождать 2 дня, затем эскалировать) и интеграций (вызвать Stripe, отправить сообщение, обновить CRM).

Пример: клиент запрашивает возврат. Процесс проверяет возраст заказа, направляет менеджеру, если он старше порога, уведомляет финансы при одобрении и отправляет клиенту обновление. Каждый шаг легко показать и обсудить простыми словами — это помогает стейкхолдерам подтвердить процесс и новым участникам понять «почему».

Инструменты вроде AppMaster’s Business Process Editor созданы для такого рода логики: вы видите путь, условия и побочные эффекты (сообщения, API-вызовы, смены статусов) без копания в скриптах базы.

Чтобы рабочие процессы не превратились в спагетти, делайте их небольшими и читаемыми. Давайте каждому workflow одну цель, давайте понятные названия шагам и ветвям, ограничивайте глубокие вложения, и логируйте ключевые решения, чтобы можно было ответить на вопрос «почему это произошло?» позже.

Когда workflow начинает делать сложные вычисления или трогать много таблиц, это сигнал вынести часть логики в другой слой. Визуальные процессы лучше выступают дирижёром, а не полной оркестровкой.

Когда лучше использовать пользовательский код

Уведомляйте нужных людей
Подключайте email, SMS или Telegram шаги прямо внутри логики рабочего процесса.
Добавить уведомления

Пользовательский код — это логика, которую вы пишете и поддерживаете как программное обеспечение: функции, сервисы или небольшие библиотеки, которые работают в вашем приложении. Это самый гибкий вариант, и поэтому его следует использовать обдуманно, а не по умолчанию.

Код оправдан, когда правило трудно безопасно выразить в хранимой процедуре или drag-and-drop процессе. Если вы ковыряете инструменты, подгоняя их под задачу, код часто выходит чище и проще для поддержания.

Сильные сигналы в пользу кода:

  • Проблема алгоритмическая (правила ценообразования, планирование маршрутов, скоринг, сопоставление, проверки на мошенничество) и имеет много крайних случаев.
  • Нужна нестандартная интеграция (партнёрский API со странной аутентификацией, сложными ретраями, жёсткой идемпотентностью).
  • Чувствительная производительность (высокообъёмная обработка, тяжёлые вычисления, тонкий контроль кэширования).
  • Логику нужно разделять в нескольких местах (web, mobile, batch) без копирования.
  • Нужны сильные автоматические тесты вокруг логики, потому что ошибки дорого обходятся.

Код также делает владение ясным: команда отвечает за ревью изменений, поддержание тестов и документацию поведения. Это лучше, чем «она живёт в трёх workflow и никто не уверен, какой из них сработает первым».

Пример: движок решений по возвратам, который учитывает историю заказов, сигналы мошенничества, статус доставки и временные окна. Утверждающие шаги можно оставить в workflow, но само решение часто лучше реализовать в коде с unit-тестами и контролем версий.

Цена реальна. Пользовательский код требует инженерного времени, ревью и поддержки. Изменения могут занять больше времени, чем правка workflow, и нужен процесс релиза. AppMaster может уменьшить объём кода, покрывая общие части визуальной логикой и модулями, при этом позволив экспортировать исходники и расширять там, где это действительно необходимо.

Пошаговый фреймворк, который можно переиспользовать

Выберите способ деплоя
Разверните на AppMaster Cloud или в своём AWS, Azure или Google Cloud окружении.
Развернуть сейчас

Команды часто пропускают самый полезный шаг: чётко записать правило, а затем выбрать дом, подходящий по поведению правила.

Используйте этот фреймворк при появлении новой логики:

  • Запишите правило в одном предложении и пометьте его. Если это про валидные данные (ограничения, уникальность, итоги), это правило данных. Если про шаги и передачи (утверждения, ожидания, уведомления) — правило процесса. Если это тяжёлые расчёты или преобразования — правило вычислений.
  • Спросите, кто редактирует и как часто. Если неинженерам нужно менять правило еженедельно, не прячьте его в SQL или релиз кода. Если изменения редки и правило должно исполняться всегда, база сильный кандидат.
  • Проверьте влияние ошибки и нужный аудиторский след. Если ошибка может привести к потере денег, проблемам с комплаенсом или трудноисправимым данным, выбирайте место с явным логированием и строгим контролем.
  • Выберите расположение и определите границу. Явно опишите входы, выходы и ошибки. Пример: «Дано order_id, вернуть allowed_refund_amount или понятный reason code.» Эта граница не даст логике разлиться по системе.
  • Выберите один слой, который будет «тонким». Решите, что должно быть «тупым», чтобы не дублировать правила. Частые варианты: база тонкая (только целостность данных), workflows тонкие (только оркестровка) или код тонкий (только склейка).

Правило большого пальца: ставьте правила данных как можно ближе к данным, процессные правила — в workflow, а вычислительные — туда, где их легче тестировать и версионировать.

Если вы используете платформу вроде AppMaster, рассматривайте базу как страховочные ограждения (таблицы, связи, базовые ограничения), используйте визуальный Business Process Editor для «кто что делает дальше», и резервируйте пользовательский код для малой части, где он действительно нужен.

Частые ошибки, приводящие к путаным системам

Грязные системы редко возникают из-за одного неверного решения. Они появляются, когда логика раскидана, скрыта или скопирована, и в итоге никто не знает, как система реально работает.

Дублирование — классическая проблема: одно и то же правило существует в двух местах, но со временем расходится. Пример: база отклоняет возвраты свыше $500, если нет записи об утверждении, но workflow всё ещё посылает запрос в платёжку, потому что проверяет другой лимит. Оба варианта «работают», пока не возникнет первый реальный крайний случай — и поддержка получает загадочный баг.

Скрытая логика — ещё одна проблема. Триггеры, хранимые процедуры и быстрая правка в базе могут быть невидимы тем, кто строит UI или workflow. Если правило не документировано рядом с workflow или API, изменения превращаются в догадки, а тестирование — в метод проб и ошибок.

Перегруженные рабочие процессы создают другой тип беспорядка. Длинная цепочка drag-and-drop с десятками ветвлений становится хрупким объектом, к которому никто не хочет прикасаться. В инструментах вроде AppMaster легко добавлять блоки, потому что это быстро, но скорость сегодня может превратиться в путаницу завтра, если у процесса нет чётких границ.

Две противоположные ошибки приводят к долговременным проблемам:

  • Слишком много в базе: каждое изменение политики превращается в проект миграции, и мелкие продуктовые правки ждут релизов базы.
  • Слишком много в коде: базовые правила данных (обязательные поля, допустимые статусы, уникальные ограничения) забываются, и плохие данные пробираются через импорты, админки или будущие интеграции.

Простая привычка предотвращает большую часть этого: держите каждое правило в одном основном месте и записывайте, где оно живёт и почему. Если вы не можете ответить «где это контролируется?» за 10 секунд, вы уже платите налог за путаницу.

Быстрая проверка: принять решение за 2 минуты

Расширяйте при необходимости
Передайте сгенерированный код инженерам, когда нужны кастомные расширения или жёсткий контроль.
Экспортировать код

Выбираете место, где правило проще всего держать корректным, видимым и изменяемым.

Начните с одного вопроса: это правило про корректность данных, то есть оно никогда не должно быть обойдённым? Если да — ближе к базе. Если это про шаги, утверждения или уведомления — ближе к слою workflow.

Быстрый чек-лист:

  • Это про корректность данных (предотвращение отрицательного инвентаря, блокировка дублирующих «активных» записей)? Тяготеет к базе.
  • Затрагивает много таблиц и нужны set-based обновления? Тяготеет к базе.
  • Нужна понятная аудиторная дорожка, кто что утвердил и когда? Тяготеет к workflow.
  • Неинженерам нужно менять это еженедельно или ежемесячно? Тяготеет к workflow.
  • Вызывается ли внешних сервисов (платежи, сообщения, AI)? Тяготеет к приложению или workflow, не к базе.

Подумайте о сбое. Правило, которое может упасть, должно падать так, чтобы люди могли восстановить ситуацию. Для безопасных ретраев и понятных ошибок чаще выбирают оркестрационный слой, где можно отслеживать состояние и обрабатывать исключения пошагово. Визуальные workflow-инструменты часто упрощают это, потому что каждый шаг явный и логируется.

Практический тайбрейкер:

  • Если система должна оставаться корректной, даже когда кто-то напишет новое приложение позже, обеспечьте правило в базе.
  • Если процесс должен читаться и проверяться операционной командой, держите его в визуальном workflow.
  • Если задействованы сложные интеграции, тяжёлые вычисления или специальные библиотеки — используйте пользовательский код.

Пример: «Сумма возврата не может превышать исходный платёж» — это корректность, обеспечьте рядом с данными. «Возвраты свыше $500 требуют одобрения менеджера и затем отправляют сообщение в Telegram» — это workflow. В AppMaster цепочка утверждений естественно ложится в Business Process Editor, а строгие ограничения — в модель данных.

Пример сценария: возвраты с утверждениями

Смоделируйте пример с возвратом
Прототипируйте процесс возврата с статусами, утверждениями и уведомлениями в одном визуальном потоке.
Создать процесс возврата

Типичный случай — возврат, который требует одобрения менеджера выше определённой суммы, плюс уведомления и чистая аудиторная запись.

Начните с одного источника правды: единой сущности Refund с суммами и полем статуса (например: requested, needs_approval, approved, rejected, processing, paid, failed). Все части системы должны читать и писать эти поля, а не держать параллельные состояния в разных местах.

Что должно быть в базе

Помещайте правила, которые защищают деньги и согласованность данных, как можно ближе к данным.

Используйте ограничения (и иногда хранимую процедуру), чтобы нельзя было вернуть больше, чем было оплачено, или оформить возврат для полностью возвращённого заказа, или создать два активных запроса на возврат для того же заказа, или менять ключевые суммы после одобрения возврата.

Также держите атомарное обновление здесь: при создании запроса на возврат записывайте строку Refund и обновляйте итоги заказа в одной транзакции. Если одна из записей падает — ничего не должно обновиться частично.

Что лучше в визуальном рабочем процессе

Шаги утверждения — про процесс, а не про защиту данных. Визуальный рабочий процесс хорош для отправки запроса нужному менеджеру, ожидания решения, обновления статуса, отправки напоминаний и уведомления потребителя.

Простой поток: создать запрос -> если сумма превышает лимит, выставить статус needs_approval -> уведомить менеджера -> если одобрено, поставить approved -> уведомить запросившего -> если нет ответа 24 часа, отправить напоминание.

В инструменте вроде AppMaster это легко мапится на Business Process, который реагирует на смены статуса и триггерит email, SMS или Telegram сообщения.

Что должно быть в пользовательском коде

Платёжные провайдеры имеют нюансы, которые не всегда удобно описать в правиле или drag-and-drop шаге. Держите провайдер-специфичную логику в коде: частичные возвраты с комиссиями, мульти-капчуры, согласование webhook-ов (провайдер говорит “paid”, а ваше приложение — “processing”), и обработку идемпотентности и ретраев, когда провайдер таймаутит.

Важно: пользовательский код не должен придумывать свои статусы. Он читает Refund, выполняет действие у провайдера и записывает обратно следующий статус и подтверждённые суммы, чтобы база оставалась надёжной «книгой», которой все доверяют.

Следующие шаги: закрепляем выбор

Хорошее решение действительно только если оно сохраняется через полгода. Цель — сделать выбор «где живёт логика?» видимым, легко тестируемым и сложным для обхода по случайности.

Составьте простую карту логики: короткий список ключевых правил и место, где вы для каждого выбрали дом. Держите её короткой и обновляйте при изменениях правила: название правила, где оно живёт (база, workflow, пользовательский код), почему (одно предложение), что оно читает и пишет, и кто утверждает изменения.

Опишите границы как неоспоримые правила, которые защищают систему при добавлении новых фич. Полезный формат: «База гарантирует X» и «Workflows обеспечивают Y». Например, база гарантирует, что запись возврата не может существовать без заказа, а workflow обеспечивает, что возвраты свыше $500 требуют одобрения менеджера.

Планируйте тестирование до изменений. Не нужен большой план — несколько кейсов, которые вы будете прогонять при каждом изменении правила:

  • Happy path (ожидаемый ввод, ожидаемый результат)
  • Failure path (отсутствующие данные, неверный статус, дублирование запроса)
  • Concurrency (двое одновременно инициируют одно и то же действие)
  • Security (пользователь пытается пропустить шаги или вызвать endpoint напрямую)

Назначьте владельцев и правила ревью. Решите, кто может править хранимые процедуры, кто — workflows, и что требует peer review. Это то место, где системы либо остаются здоровыми, либо скатываются в «никто не знает, почему это работает».

Если хотите drag-and-drop процессы без потери реальной бэкенд-структуры, платформа вроде AppMaster (appmaster.io) может быть практичным средним слоем: моделируйте данные, выражайте процесс в Business Process Editor и регенерируйте и деплойте по мере изменения требований.

Выберите одно правило с высоким эффектом, смоделируйте его, задайте границы и напишите три тест-кейса. Эта простая привычка предотвратит большую часть разрастания логики.

Вопросы и ответы

Как проще всего решить, где должна жить бизнес-логика?

Держите правило там, где оно остаётся корректным, заметным и простым для изменения. Правила целостности данных — ближе к базе, пошаговые бизнес-процессы — в рабочих процессах, а программный код используйте, когда правило слишком сложное и требует тестов и строгого контроля.

Когда стоит помещать логику в хранимые процедуры?

Используйте хранимые процедуры для защиты данных и массовых операций с данными: для обеспечения инвариантов, выполнения set-based обновлений и атомарных транзакций, которые всегда должны быть согласованными. Держите их маленькими и стабильными, чтобы они не превратились в «скрытую логику».

Когда визуальные рабочие процессы — лучший выбор?

Визуальные рабочие процессы лучше всего подходят для процессных правил: утверждений, маршрутизации, уведомлений, напоминаний, шагов ожидания и интеграций в человекочитаемой последовательности. Они идеальны, когда неинженеры или кросс-функциональные команды должны просматривать и менять процесс.

Какие признаки указывают, что правило должно быть реализовано в коде?

Выбирайте пользовательский код для алгоритмической или нетиповой логики: сложное ценообразование, решения по мошенничеству, сопоставление/оценка, продвинутые ретраи и идемпотентность, или интеграции с особыми библиотеками и тщательной обработкой ошибок. Код также нужен, если нужно мощное автоматическое тестирование вокруг дорогих ошибок.

Как обращаться с правилами, влияющими на деньги, например возвратами или скидками?

Положите критические правила денег и согласованности в базу данных, а шаги утверждения и коммуникации — в рабочий процесс. Если смешать их, либо вы заблокируете изменения продукта миграциями БД, либо плохие данные проскользнут, когда кто-то обойдёт UI.

Как избежать дублирования правил между базой, рабочими процессами и кодом?

Держите каждое правило в одном основном месте, а другие слои должны вызывать это место, а не переименовывать логику. Дублирование — причина багов типа «в UI прошло, а БД отвергло» когда лимиты, статусы или валидации расходятся.

Как не дать визуальным рабочим процессам превратиться в спагетти?

Делайте рабочие процессы небольшими и целевыми: один понятный результат, простые ветвления и читаемые названия шагов. Когда процесс начинает тяжело считать данные или менять много таблиц, вынесите вычисления в код или переместите правила целостности в базу.

Почему хранимые процедуры кажутся сложными для отладки и поддержки?

Относитесь к логике в базе как к реальным программным изменениям: версионируйте, ревьюьте, тестируйте и документируйте место, где она применяется. Делайте так, чтобы ошибки давали понятные сообщения на уровне workflow или API, чтобы люди понимали, что пошло не так и как исправить.

Как требования по соответствию и аудиту меняют решение?

Применяйте и контролируйте ограничения доступа и целостности на уровне данных, а следовую трассу принятия решений (кто что утвердил и когда) храните в слое workflow с явными статусами и логами. Такое разделение упрощает аудит: видно и правила данных, и след решений.

Как AppMaster вписывается в выбор между хранимыми процедурами и рабочими процессами?

AppMaster — практичный компромисс, когда вы хотите структурированные данные и читаемую процессную логику. Вы моделируете PostgreSQL-backed данные и выражаете бизнес-процессы в визуальном Business Process Editor, резервируя хранимые процедуры для базовых гарантий и код — для крайних случаев.

Легко начать
Создай что-то невероятное

Экспериментируйте с AppMaster с бесплатной подпиской.
Как только вы будете готовы, вы сможете выбрать подходящий платный план.

Попробовать AppMaster