По своему опыту я обнаружил, что многие приложения начинаются с простого набора таблиц, а затем и нескольких хранимых процедур для обеспечения базовой функциональности. Это работает очень хорошо; обычно он обеспечивает высокую производительность и прост в понимании, а также снижает потребность в сложном промежуточном уровне.
Однако приложения растут. Нет ничего необычного в том, чтобы видеть большие управляемые данными приложения с тысячами хранимых процедур. Бросьте триггер в микс, и у вас есть приложение, которое для любого, кроме оригинальных разработчиков (если они все еще работают над ним), очень сложно поддерживать.
Я добавлю слово для приложений, которые размещают большую часть логики в базе данных - они могут хорошо работать, когда у вас есть хорошие разработчики баз данных и / или у вас есть устаревшая схема, которую нельзя изменить. Причина, по которой я говорю это, заключается в том, что ORM значительно облегчают эту часть разработки приложений, когда вы позволяете им контролировать схему (если нет, вам часто приходится много играть, чтобы заставить ее работать).
Если бы я проектировал новое приложение, то обычно выбирал бы схему, которая определяется областью моего приложения (дизайн которой будет в коде). Обычно я позволяю ORM обрабатывать сопоставление между объектами и базой данных. Я бы относился к хранимым процедурам как к исключениям из правила, когда речь заходит о доступе к данным (создание отчетов в sprocs может быть намного проще, чем попытка заставить ORM эффективно создавать сложные выходные данные).
Однако самое важное, что нужно помнить, это то, что в дизайне нет «лучших практик». Разработчик должен взвесить все за и против каждого варианта в контексте вашего дизайна.