Как правило, всегда есть некоторое дублирование, и базы данных - это не просто тупые репозитории.
дб
База данных обеспечивает целостность на уровне данных. Ограничения внешнего ключа, ненулевые ограничения и ограничения размера все в основном покрываются базой данных.
Вы не можете делать все в БД, но вы можете сделать многое. Защитите данные.
бизнес-уровень
Поднимая уровень, у вас есть бизнес-логика. Обычно это ваша точка интеграции с другими приложениями (веб-сервис, ваш собственный интерфейс и т. Д.). Здесь бизнес-логика закодирована в приложении. Такие вещи, как если продукт имеет конечную дату x, то это не может также произойти в y, если у y другая конечная дата.
Было бы сложно описать такого рода правила в базе данных, поэтому вы не можете. Но ваш уровень бизнес-логики все еще перехватывает вещи, которые, как он знает, являются недопустимыми. например если поле описания не может быть пустым, бизнес-логика никогда не должна отправлять его в базу данных. В любом случае это будет ошибка, но вы пытаетесь перехватить вещи в том месте, где они известны как плохие.
также трудно выразить в базе данных другие «правила», например, «у новых пользователей срок годности 1 год, если они из Арканзаса, в противном случае - 2 года, если у них нет 3 детей и один из них называется Барри». Мы можем смеяться над этим примером, но опытный программист скажет вам, что бизнес-логика - один из самых больших оксюморонов вокруг.
щ
Переходя к пользовательскому интерфейсу, пользовательский интерфейс также регулярно кодирует бизнес-логику на экранах. Формы и другие страницы часто будут существовать в недопустимом состоянии, и пользовательский интерфейс должен знать правила хотя бы большую часть времени. Надеемся, что пользовательский интерфейс переносит логику на бизнес-уровень, но бизнес-уровень не имеет понятия, что поле 1 является датой исполнения, а поле 2 - описанием.
Пользовательский интерфейс знает, что нужно искать товары с помощью X, если пользователь уже выбрал виджет Y.
Пользовательский интерфейс знает, что описание требуется, и что количество элементов> 0 и <100 (В этих примерах хороший пользовательский интерфейс будет полагаться на бизнес-уровень, чтобы сообщить ему, например, минимальное и максимальное значения, но пользовательский интерфейс все еще осведомлен отношений) </p>
В веб-интерфейсы мы также добавляем клиентский скрипт, который снова дублирует логику в коде сервера. Мы используем клиентский сценарий для лучшего взаимодействия с пользователем, но в итоге не доверяем ничему, что исходит от клиента (сценарий может быть отключен, поля формы обработаны вручную и т. Д.)
Итак, вы можете видеть, что логика будет продублирована. Вы пытаетесь уменьшить дублирование настолько, насколько это возможно, но на самом деле это редко возможно при использовании нетривиальной программы.