Я сообщу свое мнение, несмотря на то, что мои проблемы, возможно, не имеют прямого отношения к вопросу.:
Как и во многих вопросах, ответ об использовании хранимых процедур или решения на уровне приложений зависит от вопросов, которыебудет направлять общие усилия:
- То, что вы хотите получить.
Вы пытаетесь выполнять либо пакетные операции, либо онлайн-операции?они полностью транзакционны?насколько повторяются эти операции?Насколько велика ожидаемая рабочая нагрузка для базы данных?
- Что у вас есть для того, чтобы его получить.
Какие у вас технологии баз данных?Что за инфраструктура?Ваша команда полностью обучена технологии баз данных?Ваша команда лучше способна создать решение, основанное на базе данных?
Никаких секретов об этом.
Ваше решение должно быть распределено по нескольким местам?ваше решение требуется для использования удаленной связи?Ваше решение работает на нескольких серверах баз данных или, возможно, использует кластерную архитектуру?
Сколько требуется изменить приложение?Есть ли у вас сотрудники, специально обученные обслуживанию этого решения?
Видите ли вы, что ваша технология баз данных изменится в короткие, средние и длительные сроки?Как вы считаете, потребуется ли часто мигрировать решение?
Сколько будет стоить внедрение этого решения с использованием той или иной стратегии?
Общее количество этих пунктов будет определять ответ.Таким образом, вы должны заботиться о каждом из этих пунктов, когда принимаете решение об использовании какой-либо стратегии или нет.Существуют случаи, когда использование хранимых процедур лучше, чем управляемые запросы уровня приложения, и другие, когда лучше всего выполнять запросы и использовать решение на уровне приложения.
Использование хранимых процедур более целесообразно, когда:
- Технология вашей базы данных не может быть изменена в течение короткого времени.
- Ваша технология базы данных можетобрабатывать параллельные операции, разбиения таблиц или любую другую стратегию для разделения рабочей нагрузки на несколько процессоров, памяти и ресурсов (кластеризация, сетка).
- Технология вашей базы данных полностью интегрирована с языком определения хранимых процедур, то есть поддержкойнаходится внутри механизма базы данных.
- У вас есть команда разработчиков, которая не боится использовать процедурный язык (язык 3-го поколения) для получения результата.
- Операции, которые вы хотите выполнить, созданы-внутри или поддерживаются внутри базы данных (экспорт в данные XML, управление целостностью и согласованностью данных с помощью триггеров, запланированных операций и т. д.).
- Переносимость не является важной проблемой, и вы не вносите никаких изменений в технологиюкороткое время в вашей организации, даже,это не желательно.Обычно переносимость рассматривается разработчиками, ориентированными на приложения, и ориентированными на многие уровни.С моей точки зрения, переносимость не является проблемой, когда ваше приложение не требуется для развертывания на нескольких платформах, меньше, когда нет причин для изменения технологии или если усилия по переносу всех организационных данных выше, чемвыгода для внесения изменений.То, что вы можете выиграть, используя подход, основанный на уровне приложений (переносимость), вы можете потерять в производительности и стоимости, полученной из вашей базы данных (зачем тратить тысячи долларов, чтобы получить Ferrari, который вы будете ездить со скоростью не более 60 миль / час?).
- Производительность - это проблема. Во-первых: в нескольких случаях вы можете достичь лучших результатов, используя один вызов хранимой процедуры, чем несколько запросов данных из другого приложения. Более того, некоторые характеристики, которые вам необходимо выполнить, могут быть встроены в вашу базу данных, и ее использование обходится дешевле с точки зрения рабочей нагрузки. Когда вы используете решение на уровне приложений, вы должны учитывать затраты, связанные с установлением соединений с базой данных, вызовами к базе данных, сетевым трафиком, переносом данных (т. Е. При использовании Java или .NET неявные затраты возникают, когда использование вызовов JDBC / ADO.NET, поскольку вы должны обернуть свои данные в объекты, представляющие данные базы данных, поэтому создание экземпляров сопряжено с затратами в плане обработки, памяти и сети, когда данные поступают и выходят наружу).
Использование решений на уровне приложений обычно более целесообразно, когда:
- Переносимость является важной проблемой.
- Приложение будет развернуто в нескольких местах только с одним или несколькими хранилищами базы данных.
- Ваше приложение будет использовать строгие бизнес-ориентированные правила, которые должны быть независимы от базовой технологии баз данных.
- Вы хотите сменить поставщиков технологий в зависимости от тенденций рынка и бюджета.
- Ваша база данных не полностью интегрирована с языком хранимых процедур, который обращается к базе данных.
- Возможности вашей базы данных ограничены, и ваши требования выходят за рамки того, что вы можете достичь с помощью технологии базы данных.
- Ваше приложение может поддерживать наказание, присущее внешним вызовам, оно в большей степени основано на транзакциях с правилами, специфичными для бизнеса, и должно абстрагировать модель базы данных от бизнес-модели для пользователей.
- Распараллеливание операций с базой данных не важно, более того, ваша база данных не имеет возможностей распараллеливания.
- У вас есть команда разработчиков, которая недостаточно хорошо знакома с технологией баз данных и более продуктивна благодаря использованию технологии, основанной на приложениях.
Надеюсь, это может помочь любому, кто спрашивает себя, что лучше использовать.