Некоторые мысли: обратите внимание, что это ответ, ориентированный на Java, но это основная часть моего недавнего (последних 10 лет) опыта
(1) Параллельная разработка (большой) командой разработчиков. Если ваше приложение достаточно сложное, что каждый разработчик не может создать свою собственную частную версию БД (с посещенными ссылками / ссылочными данными / и т. Д.), Очень трудно заставить целую КОМАНДУ разработчиков работать над один и тот же набор пакетов PL-SQL (например) одновременно хранится в общей базе данных DEVL? Тогда вы застряли (мой опыт) с работой в БД с неверными процедурами / несоответствием кода таблицам, когда люди вносят изменения ...
Как архитектор Java, я думаю, что гораздо проще, чтобы каждый разработчик имел частный экземпляр JBoss на своем рабочем столе и мог легко работать со своим собственным набором функций и интегрироваться в своем собственном темпе, не влияя на всех остальных ... мне ...
(2) Наборы инструментов для непрерывной интеграции
Хотя в мире БД существуют некоторые похожие «концепции», мой опыт показал мне, что комбо (я выбираю свои лучшие фавориты в этой области):
- mvn - сборка системы
- junit - автоматизированное модульное тестирование
- nexus - менеджер репо (управляет версией жизненного цикла артефакта, снимками и выпусками)
- hudson - ci build server
- sonar - инструмент статического анализа / отчеты о покрытии кода / ALOT
более
Выполнение большого проекта с использованием всего вышеперечисленного (бесплатные инструменты) позволяет согласованно / легко доставить XP в массы и обеспечить контроль качества всего ИТ-персонала.
Oracle / PL-SQL не имеет наборов инструментов для соответствия
(3) инструменты / библиотеки / и т.д ...
У Java есть доступ к удивительному набору сервисов, которые другие платформы не могут использовать - некоторые бесплатные, некоторые нет.
даже базовые, такие как log4j (да, они есть для PL / SQL, но, пожалуйста, не совсем так), позволяют разработчикам создавать гибко настраиваемые журналы, которые можно изменять на лету (идеально подходит для дублирования) , Автоматизированная документация по API (через javadoc). Автоматизированные отчеты о покрытии модульных испытаний. Невероятные IDE (Eclipse) со встроенными отладчиками / автоматическое развертывание на серверах приложений. API для взаимодействия со всеми типами сервисов под солнцем, библиотеки с открытым исходным кодом для НИЧЕГО и 100% поддержки от каждого поставщика
(4) повторное использование услуг. то, что кто-то прокомментировал, правда. Если у вас есть сверхпрочные бизнес-правила, управляемые данными , то вы можете утверждать, что они должны находиться на уровне БД. Зачем? чтобы все средние уровни не дублировали эту логику.
Но то же самое можно сказать и о бизнес-правилах, которые не управляются данными или являются достаточно сложными, чтобы ОО был более естественным выбором . Если вы вставите ВСЕ бизнес-логику в БД, то они будут доступны только через БД.
- Что делать, если вы хотите, чтобы проверка выполнялась на уровне клиента или среднего уровня приложения и сохранялась в обе стороны в БД?
- Что если вы хотите кэшировать данные только для чтения на среднем уровне (для производительности) и выполнять бизнес-правила для кэшированных данных?
- Что если у вас есть служба среднего уровня, которая не требует доступа к БД, или у вас есть клиент, который может предоставлять свои собственные данные?
- Что если зависимой от данных части бизнес-правил потребуется доступ к внешним службам? Затем вы заканчиваете фрагментированной бизнес-логикой, которая выглядит следующим образом:
я
retCode = validateSomeDate(date);
if (retCode == 1) then
evaluateIfCustomerGetsEmail(...)//probably more stored proc invocations here...
sendEmailMsg(....)
else if (retCode == 2) then
performOtherBizLogicStuf(...) //again, may need data, may not need data
triggerExternalsystemToDoSomething(...) //may not be accessible via PL/SQL
fi
Я уверен, что мы все видели системы, написанные как та, что выше, и должны были отлаживать их в 2 часа ночи. Чрезвычайно сложно получить четкое представление о сложном процессе, когда бизнес-логика фрагментирована между уровнями, а в некоторых случаях ее невозможно поддерживать.