Всегда есть спор по теме - «Поместить ли бизнес-логику в хранимую процедуру или нет?». Если мы решим не использовать инструмент ORM и не помещать бизнес-логику в хранимую процедуру, тогда куда мы поместим бизнес-логику?
В моих предыдущих приложениях я всегда предпочитал помещать всю бизнес-логику только в хранимые процедуры. Затем из кода .NET я вызываю эти хранимые процедуры, используя блоки доступа к данным. SQLHelper и т. Д. Но это не может быть сценарий все время. Так что я немного погуглил, но в итоге растерялся .......
Любые предложения ...?
Ответы:
Я бы принял прагматический подход - исторически главное «преимущество» хранения бизнес-логики в хранимых процессах заключается в соображениях производительности (архитектура 2,5 уровня), в то время как разделение бизнес-логики на уровень BLL (уровень 3 / N) обычно чище от перспективы технического обслуживания, и легче тестировать (макет / заглушка доступа к данным).
Однако, учитывая, что .NET ORMS с поддержкой LINQ, такие как LINQ2SQL, EF и NHibernate, теперь создают параметризованные SQL-запросы, где планы запросов могут кэшироваться, экранироваться для SQL-инъекций и т. Д., Я думаю, что переход к 3 / N-уровневой архитектуре более привлекательным, чем когда-либо, и большинства SPROC (особенно ориентированных на запросы) можно вообще избежать. Шаблоны репозитория в .NET обычно предоставляют параметры дерева выражений IQueryable / accept, что обеспечивает безопасный тип, но в то же время гибкий доступ к вашим таблицам. (Лично в архитектурах типа SOA я бы не стал раскрывать IQueryable за пределами BLL, т. Е. Ваши уровни Service и Presentation должны работать с четко определенным набором методов. Причина в том, что в противном случае вы никогда не сможете полностью протестировать свою систему, и вы выиграли ».
Тем не менее, в приличной системе всегда будет несколько исключений, когда действительно требовательный к данным фрагмент кода может все еще быть записан как сохраненный процесс по соображениям производительности. В этих случаях я оставляю SPROC и открываю SPROC через ORM, но все равно представляю функцию как метод сквозного доступа для вашего BLL.
источник
Будучи Java-разработчиком, я предпочел поместить бизнес-логику в BLL (удобный и простой источник контроля, знакомство и т. Д. И т. Д.).
Однако после работы на большом предприятии с множеством распределенных приложений, использующих различные технологии (C #, Java, Pick (не спрашивайте)), стало очевидным одно существенное преимущество использования хранимых процедур:
Хранимые процедуры могут быть общими для разных приложений .
источник
У нашей команды есть мягкое правило. Иногда лучше решить бизнес-логику в T-SQL, иногда проще сделать это в c # (бизнес-уровень).
Таким образом, у нас есть прагматичное решение: поместите туда, где оно подходит лучше. Я знаю, что теория иногда очень строга к этому ... но это теория :-)
источник
Есть преимущества и недостатки у обоих (на мой взгляд):
Хранимые процедуры могут стать кошмаром, если вы не используете какой-либо элемент управления исходным кодом SQL (чего не хватает во многих местах) и над вами работают несколько разработчиков. Кто-то может изменить хранимую процедуру и забыть обновить код, который вызывает эту процедуру, и, прежде чем вы узнаете об этом, вы только что создали и развернули сайт, который будет генерировать необработанные исключения (несоответствие количества параметров и т. Д.).
С другой стороны, хранимые процедуры позволяют быстрее исправлять ошибки в определенных ситуациях. Если в хранимой процедуре есть ошибка, вы просто исправляете ее, и все готово. Исправление ошибки в ORM требует перестройки. В зависимости от вашего процесса сборки это может быть длительным / раздражающим.
источник
Мы всегда размещаем нашу бизнес-логику на уровне бизнес-логики. Если вы поместите его в хранимую процедуру, он будет потерян, как только вы поменяете свою СУБД.
источник
«Бизнес-логика» - это немного туманный термин. Я имею в виду, что у него нет единого определения. Практическое правило заключается в том, чтобы свести к минимуму связь между уровнями, когда это возможно. Таким образом, вам не нужно отправлять пустое имя клиента на сервер, чтобы проверить его перед вставкой строки.
Бывают случаи, когда правило основано на чтении базы данных. Скажем, вы хотите перевести деньги со Счета 1 на Счёт 2. Вы должны прочитать оба аккаунта, убедиться, что они находятся в хорошем состоянии и что сумма на Счете 1 достаточна. В этом случае сервер является лучшим кандидатом для этого правила, потому что клиенту (который здесь является BL) не нужно выполнять 3 вызова уровня базы данных для этого процесса.
Конечно, если вам нужно, чтобы ваше решение было независимым от базы данных, создавайте хранимые процедуры только для CRUD (если они вообще используются).
источник
Логика должна быть в BLL всегда, потому что:
Я считаю, что должен быть закон, который гласит, что после того, как SP больше X строк, он не будет работать так, как задумано.
источник
Мы создаем сервисный слой, который содержит всю нашу бизнес-логику, реализованную на выбранном языке, и используем базу данных только для запросов. Этот подход является своего рода обязательным для нас, потому что наша цель заключается в создании COTS-решений для доставки приложений с различными реализациями баз данных. Hibernate оказался спасателем для нас в этих обстоятельствах.
Я думаю, что наибольшим преимуществом этого подхода, помимо переносимости базы данных, является то, что вы можете найти все свои ответы в одном поиске.
Кроме того, несмотря на некоторые ответы на форуме, у меня есть друг, работающий в страховой компании «Фортуна 100», который сделал 2 преобразования базы данных за три года, потому что база данных, выбранная для компании, изменилась.
источник
Из своего ограниченного опыта я предпочитаю поддерживать целостность данных с помощью хранимых процедур и других функций базы данных. Например, если бы я осуществлял перевод средств между двумя счетами, я бы написал хранимую процедуру. Я считаю ценным иметь возможность использовать несколько языков приложений.
источник