Через несколько лет вопрос все еще важен ...
Простое эмпирическое правило для меня: если это логическое ограничение или вездесущее выражение (одно выражение), поместите его в базу данных (да, внешние ключи и ограничения проверки тоже являются бизнес-логикой!). Если это процедурно, содержит циклы и условные ветви (и действительно не может быть преобразовано в выражение), поместите его в код.
Избегайте мусорных БД
Попытки поместить действительно всю бизнес-логику в код приложения, вероятно, приведут к вырождению (реляционной) базы данных в дамп мусора, где реляционный дизайн в основном полностью пропущен, где данные могут иметь любое несовместимое состояние и отсутствует нормализация (часто в основном XML, JSON). , CSV и др. Мусорные колонки).
Этот вид логики только для приложений, вероятно, является одной из главных причин роста NoSQL - конечно, с недостатком, что приложение должно заботиться обо всей логике, которая была встроена в реляционные БД на протяжении десятилетий. Однако базы данных NoSQL больше подходят для такого рода обработки данных, например, документы данных поддерживают неявную «реляционную целостность» внутри себя. Для реляционных БД это просто злоупотребление, вызывающее еще больше проблем.
Выражения (на основе набора) вместо процедурного кода
В лучшем случае каждый запрос данных или операция должна быть закодирована как выражение, а не как процедурный код. Отличная поддержка для этого - когда языки программирования поддерживают выражения, такие как LINQ в мире .NET (к сожалению, в настоящее время только запросы, никаких манипуляций). Что касается реляционной БД, то в течение долгого времени учили отдавать предпочтение выражениям операторов SQL, а не процедурным курсорам. Таким образом, БД может оптимизировать, выполнять операции параллельно или что-то еще, что может быть полезным.
Использовать механизмы целостности данных БД
Когда речь идет о СУБД с ограничениями внешнего ключа и проверки, вычисляемыми столбцами, возможно, триггерами и представлениями, это место для хранения базовой бизнес-логики в базе данных. Правильная нормализация помогает поддерживать целостность данных, чтобы обеспечить уникальный и уникальный экземпляр данных. Даже если вам придется дублировать его в коде и БД, эти основные механизмы целостности данных не должны быть опущены!
Хранимые процедуры?
В настоящее время хранимые процедуры редко нужны, поскольку базы данных сохраняют скомпилированные планы выполнения для SQL и повторно используют их, когда повторяется один и тот же запрос, только с разными параметрами. Таким образом, аргумент прекомпиляции для SP больше не действителен. Можно хранить или автоматически генерировать запросы SQL в приложении или ORM, которые большую часть времени находят предварительно скомпилированные планы запросов. SQL является языком выражений, если вы явно не используете процедурные элементы. Таким образом, в лучшем случае вы используете выражения кода, которые можно перевести на SQL.
Хотя сторона приложения, включая сгенерированный ORM, SQL больше не находится внутри базы данных, в отличие от хранимых процедур, я все равно считаю это кодом базы данных. Потому что он все еще требует знания SQL и базы данных (кроме самого простого CRUD) и, при правильном применении, работает значительно иначе, чем процедурный код, обычно создаваемый с помощью языков программирования, таких как C # или Java.