Some thoughts: note that this is a Java-oriented answer, but its main part of my last (last 10 years) experience
(1) Parallel development by a (large) development team. If the application is complex enough so that each developer cannot create his own private version of the database (with the participation of links / links to data, etc.), it is very difficult to have a whole TEAM of developers who all work on the same set of PL-SQL packages ( for example) stored in a common DEVL DB database? Then your stuck (my experience) with working in a database with the wrong procedures / code mismatch with tables, as people make changes ...
As a Java architect, I think it’s much easier to have each developer on a private JBoss instance on the desktop and easily work on their own set of features and integrate at their own pace without affecting everyone else ... which brings me ...
(2) Tools for continuous integration Despite the fact that there are several similar “concepts” in the world of databases, my experience has shown me that combos (I choose my best best of its kind here):
- mvn - build system
- junit - automatic module testing
- nexus - repo manager (manages artifact life cycle versions, snapshots and releases)
- Hudson server - ci build
- sonar - static analysis / code coverage reports / ALOT more
Starting a large project using all of the above (free tools) allows you to provide a simple / easy way to deliver XP to the masses and ensure quality control over all IT staff. Oracle / PL-SQL Does Not Have Matching Toolkits
(3) tools / libraries / etc ... Java has access to an amazing set of services that other platforms cannot touch - some are free and some are not. even basic ones like log4j (yes, they have it for PL / SQL, but pulease ... it's not the same thing) allows things like allowing developers to create customizable logs that can be changed on the fly (perfect suitable for dubugging) Automated API documentation (via javadoc). Automated unit test coverage reports. Incredible IDEs (Eclipse) with built-in debuggers / autodeploy for application servers. API for interacting with each type of service under the sun, open source for FREE and 100% support for each provider
(4) reuse of services. what someone commented is true. If you have heavy data-driven business rules, you can argue that they must live at the database level. What for? to prevent the presence of intermediate level (s), all of which should duplicate this logic.
But the same can be said for business rules that are not data-driven or complex enough that OO is a more natural choice . If you adhere to all business logic in the database, then they are available only through the database.
- What if you want the check to be performed at the client or mid-level level and a round trip to the database is maintained?
- What if you want to cache read-only data at an average level (for performance) and follow business rules against cached data?
- What if you have a mid-range service that does not require access to the database, or you have a client that can provide its own data?
- What should I do if part of the data-dependent business rules needs access to external services? Then you end up with fragmented business logic that looks like this:
I am
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
I am sure that we all saw the systems written as above, and we had to debug them at 2 in the morning. It is extremely difficult to get a consistent sense of the complex process when the business logic is fragmented between levels, and in some cases it cannot be supported.