П р и м е ч а н и е - Аудитория programmers.se и dba.se различна и будет иметь разные точки зрения, поэтому в этом случае я думаю, что допустимо дублировать. Каковы аргументы против или для размещения логики приложения на уровне базы данных? на programmers.se.
Я не смог найти обсуждения по dba по этому вопросу, и в оригинальном сообщении все сказано, поэтому:
Большинство разработчиков программного обеспечения хотят сохранить логику приложения на уровне приложений, и, вероятно, для нас естественно держать ее здесь. Разработчики баз данных, похоже, хотят поместить логику приложения на уровень базы данных, как триггеры и хранимые процедуры.
Лично я предпочел бы хранить как можно больше на уровне приложений, чтобы упростить отладку и разделить обязанности между уровнями.
Что вы думаете об этом, и что должно или не должно быть хорошо для реализации на уровне базы данных?
NB. Я не являюсь ОП по этому вопросу, но оставил оригинальную формулировку без изменений.
источник
Ответы:
Разные мысли ...
Код вашей базы данных переживет технологию вашего клиентского приложения. Подумайте о ADO.NET -> Linq -> EF, а также о различных ORM. Принимая во внимание, что вы все еще можете запускать код SQL Server 2000 с прошлого тысячелетия против всех вышеупомянутых клиентских технологий.
У вас также есть проблема с несколькими клиентами: у меня есть .net, java и Excel. Это 3 набора логики приложения.
«Бизнес-логику» не следует путать с «логикой целостности данных». Если у вас есть клиенты, начинающие транзакции и выполняющие различные проверки, это много вызовов БД и длинных транзакций.
Логика приложения не масштабируется для больших объемов данных. У нас есть 50 тыс. Строк в секунду с использованием сохраненных процедур. Сестринская команда, использующая Hibernate, не может получить одну в секунду
источник
Я хочу всю логику, которая должна применяться ко всем пользователям и всем приложениям в базе данных. Это единственное вменяемое место.
В последнем Fortune 500, над которым я работал, приложения, написанные как минимум на 25 языках, попали в базу данных OLTP. Некоторые из этих программ были запущены в производство в 1970-х годах.
Альтернатива реализации такого рода требований в базе данных - позволить каждому прикладному программисту переопределить все или его часть на 100% правильно, каждый раз, когда они запускают свой редактор, со дня, когда они впервые выходят за дверь, до того, как компания выходит из бизнес.
Каковы шансы?
Разве это не самое большое « не повторяйся » на планете?
источник
Я перемещаю свой старый ответ через неотредактированный файл programmers.se, поскольку ответы кажутся довольно поляризованными между сайтами.
источник
Наиболее важная проблема заключается в том, считает ли какой-либо «слой» над базой данных, что он владеет данными. Параллелизм и целостность данных - это проблемы, решением которых является СУБД. Некоторые приложения разрабатываются так, как если бы база данных была просто их личным набором битов, и, конечно же, в конечном итоге они пытаются заново изобрести колесо всеми возможными способами, а также быть непоправимо сломанным, как только какое-то другое приложение получит доступ к той же базе данных
источник
Я написал свой ответ на это в своем блоге . Мой вывод заключается в том, что выполнение этого в приложении просто не масштабируется, если учесть весь жизненный цикл приложения.
источник
SQL выполняет такие вещи, как установка логики и прикладная фильтрация результатов? SQL - замечательный язык манипулирования множествами.
Кроме того, как указывало GBN выше, код SQL почти повсеместно переживет код приложения.
Хотя верно то, что EF, NHibernate, LinqToSql или что-то еще позволит вам генерировать код быстрее, каждый программист, достойный своей производительности, знает, что только оптимизация SQL оптимизирует поиск данных. СУБД понимает только SQL, поэтому вам нужно все преобразовать в SQL, прежде чем все будет сказано и сделано. (при условии, что мы можем согласиться с тем, что TSQL и PLSQL по-прежнему являются SQL)
источник
Один минус, который люди не обязательно обсуждают - плюсы здесь исчерпаны - это стоимость.
Процессоры на сервере базы данных часто являются самыми дорогими процессорами в любой организации, если сравнивать стоимость лицензирования программного обеспечения. Поэтому перемещение бизнес-логики на уровень данных - это то, что должно быть сделано разумно, а не обязательно единообразно.
источник
Именно здесь неизбежно должно произойти встреча умов, то есть умов разработчиков (DV) и администраторов баз данных. Работа с бизнес-логикой (BL) и ее хранение в базе данных может оказать влияние, которое может либо прославить, либо ужаснуть ее реализацией.
Для некоторых продуктов СУБД существуют превосходные библиотеки / инструменты / API для бизнес-логики и объектной инфраструктуры, которые можно быстро освоить и использовать в их приложениях. Для других СУБД нет библиотек / инструментов / API.
В прошлом приложения клиент-сервер делали мост в BL с помощью хранимых процедур (SP). Для таких продуктов, как Oracle и SQL Server, это было сделано рано. С появлением баз данных с открытым исходным кодом, таких как PostgreSQL и MySQL, те, кто их использует, рискуют выйти на новый уровень с помощью хранимых процедур в BL. PostgreSQL очень быстро стал зрелым, так как были реализованы не только хранимые процедуры, но и возможность создавать языки клиентов. MySQL в основном прекратил развиваться в мире хранимых процедур и появился в урезанной форме языка со многими ограничениями. Таким образом, когда дело доходит до BL, вы полностью зависите от MySQL и его языка хранимых процедур.
На самом деле остается только один вопрос: независимо от СУБД, BL должен полностью или частично находиться в базе данных?
Подумайте о разработчике. Когда в приложении что-то идет не так, процесс отладки будет заставлять разработчика входить и выходить из базы данных, чтобы следовать изменениям данных, которые могут быть или не быть правильными с перерывами. Это похоже на кодирование приложения C ++ и вызов кода ассемблера в середине. Вы должны переключиться с исходного кода, классов и структур на прерывания, регистры и смещения И НАЗАД !!! Это выводит отладку на тот же уровень.
Разработчики могут создать высокоскоростной метод выполнения BL в сочетании с языковыми конфигурациями (флаги компилятора для C ++, различные настройки для PHP / Python и т. Д.) С помощью бизнес-объектов, находящихся в памяти, а не в базе данных. Некоторые пытались объединить эту идеологию для более быстрого выполнения кода в базе данных, написав библиотеки, в которых отладка хранимых процедур и триггеров хорошо интегрирована в базу данных и кажется бесполезной для использования.
Таким образом, перед разработчиком стоит задача разработать, отладить и поддерживать исходный код и BL в двух языках.
Теперь подумайте о DBA. Администратор базы данных хочет сохранить базу данных максимально доступной и иметь в виду хранимые процедуры. Администратор базы данных может рассматривать BL как нечто внешнее по отношению к базе данных. Тем не менее, когда SQL запрашивает данные, необходимые для BL, SQL должен быть скудным и средним.
Теперь для встречи умов !!!
Разработчик кодирует SP и использует итеративные методы. DBA смотрит на SP. DBA определяет, что один оператор SQL может заменить итеративные методы, написанные разработчиком. Разработчик видит, что оператор SQL, предложенный администратором базы данных, требует вызова другого кода, связанного с BL, или SQL, который не соответствует обычным планам выполнения оператора SQL.
В свете этого конфигурация, настройка производительности и SP-кодирование становятся функцией глубины и интенсивности данных BL для поиска данных. Чем больше глубина и интенсивность использования данных BL, тем больше разработчиков и администраторов баз данных должны находиться на одной странице для объема данных и вычислительной мощности, предоставляемых базе данных.
ЗАКЛЮЧЕНИЕ
Способ извлечения данных должен всегда включать в себя как лагеря разработчиков, так и базы данных. Всегда следует идти на уступки в отношении того, какие методы кодирования и парадигмы поиска данных могут работать вместе, как для скорости, так и для эффективности. Если подготовка данных для обработки исходного кода выполняется только один раз, прежде чем код получит данные, администратор БД должен продиктовать использование бережливого и среднего SQL. Если BL - это то, с чем DBA не согласен, то бразды правления находятся в руках разработчика. Вот почему администратор базы данных должен видеть себя и часть команды проекта, а не остров для себя, а разработчик должен позволить администратору базы данных выполнить точную настройку SQL, если он этого требует.
источник
Это хороший вопрос, чтобы задать на веб-сайте, полном DBA. Надеемся, что большинство ответов будет "за" в отношении поддержания базы данных в состоянии ACID и, следовательно, сохранения бизнес-логики в базе данных. :-)
Что касается моего мнения, я думаю, что вы должны реализовать бизнес-логику как в своих приложениях, так и в базах данных. Этот подход будет стоить больше времени и денег, но я думаю, что в результате у него будет качественное лучшее бизнес-решение.
источник
Как сказал выше Адам Муш, здесь есть еще что посмотреть на производительность. Использование процессора. Использование памяти.
Блокировать явно неправильные вещи от попадания в базу данных.
Когда вы становитесь глубже, тогда нужно принимать решения. Сервер БД - это очень дорогое место, чтобы делать вещи, которые клиент мог бы легко сделать. пример: форматирование данных, форматирование дат, сборка строк и т. д. на стороне клиента.
Вы делаете математику / обработку на клиенте или на сервере БД? Для меня это зависит от сложности и количества записей. Бизнес-логику действительно следует выполнять в самой БД, чтобы все обрабатывалось одинаково.
Вы действительно должны создать API представлений для чтения и сохранения процедур для записи данных в БД, чтобы избежать головной боли в будущем.
Используйте сильные стороны каждого конца в свою пользу.
источник