Бизнес-логика — где живёт

Идеал по DDD: единая изолированная бизнес-логика, переиспользуемая на фронте и бэке. Реальность: ~80% логики действительно общая, но часть живёт ближе к данным (в БД), часть — ближе к пользователю (UI-валидации).

Три уровня размещения логики

  • Фронтенд — мгновенный UX, валидации, форматирование.
  • Бэкенд — авторитативные проверки, бизнес-процессы.
  • БД — хранимые процедуры, триггеры, вьюшки. Десятки/сотни раз быстрее, чем дёргать СУБД из приложения.

Почему логика в БД эффективна

  • Хранимая процедура → план исполнения, оптимизированный СУБД.
  • Близко к данным в оперативке СУБД — нет round-trips.
  • СУБД собирает статистику и переоптимизирует план.

Признаки неправильного размещения

  • Валидации продублированы во всех трёх слоях, расходятся.
  • Бэкенд тащит всю таблицу в Node чтобы JS-кодом отфильтровать — БД сделала бы это в 100× быстрее.
  • Фронт пишет SQL — нет.
  • Бизнес-логика только на фронте → клиент может обойти.

Пример: общая логика домена

// shared/domain/order.js — работает и на фронте, и на бэке
export function calcDiscount(order, user) {
  if (user.tier === 'vip') return order.total * 0.2;
  if (order.total > 10000) return order.total * 0.05;
  return 0;
}

Антипаттерн: дублирование

// фронт
if (price > 1000) discount = price * 0.1;
// бэк
if (price > 1000) discount = price * 0.1; // дубль, разойдётся
// БД
CREATE TRIGGERIF price > 1000 THEN discount := 0.1; // ещё один дубль

🎓 Источники

  • 🎓 [Weekly call #226 — Бизнес-логика на frontend, backend и в БД] · 2025-10-17 · YouTube
    • «~80% логики общая. По чистой архитектуре, по DDD — нужно стремиться к цельной логике».
    • Альтернативная позиция: «Логика в БД — в десятки/сотни раз быстрее. СУБД — это сервер приложений: данные и логика в одном пространстве». Контр-консенсус: индустрия выносит логику из БД утверждает это ошибкой производительности.
  • 🎓 [DDD в JS/TS — где размещать бизнес-логику] · 2025-10-03 · YouTube
    • Репозиторий возвращает entity, перекладывая из «бесформенных» структур БД.
  • 🎓 [Metarhia Weekly #192 — стыковка DDD фронт+бэк] · 2025-03-01 · YouTube
    • Local-first: домен на клиенте + реактивная локальная СУБД.

См. также