Quelques réflexions : Veuillez noter qu'il s'agit d'une réponse centrée sur Java, mais c'est l'essentiel de mon expérience récente (les 10 dernières années).
(1) Développement simultané par une (grande) équipe de développeurs. Si votre application est suffisamment complexe pour que chaque développeur ne puisse pas mettre en place sa propre version de la base de données (avec des liens, des données de référence, etc...), il est très difficile d'avoir une équipe entière de développeurs travaillant tous sur le même ensemble de paquets PL-SQL (par exemple) en même temps, stockés dans une base de données DEVL partagée ? Dans ce cas, vous êtes coincé (d'après mon expérience) à travailler dans une base de données avec des procédures invalides / une mauvaise correspondance entre le code et les tables lorsque les gens font des changements...
En tant qu'architecte Java, je pense qu'il est beaucoup plus facile pour chaque développeur d'avoir une instance JBoss privée sur son bureau et de travailler facilement sur son propre ensemble de fonctionnalités, et de les intégrer à son propre rythme sans avoir d'impact sur les autres... ce qui m'amène à...
(2) Outils d'intégration continue Bien qu'il existe des "concepts" similaires dans le monde des bases de données, mon expérience m'a montré que la combinaison de (je choisis ici mes favoris actuels) :
- mvn - système de construction
- junit - tests unitaires automatisés
- nexus - gestionnaire de repo (gère les cycles de vie des artefacts : version, snapshots et releases)
- hudson - serveur de construction ci
- sonar - outil d'analyse statique / rapports de couverture de code / ALOT plus
L'exécution d'un grand projet à l'aide de tous les outils susmentionnés (outils gratuits) permet de fournir XP aux masses de manière cohérente et facile et d'appliquer des contrôles de qualité à l'ensemble du personnel informatique. Oracle / PL-SQL n'a pas les outils nécessaires.
(3) outils / bibliothèques / etc... Java a accès à un ensemble incroyable de services que les autres plateformes ne peuvent pas toucher - certains gratuits, d'autres payants. Même les plus basiques, comme log4j (oui, ils l'ont pour PL/SQL, mais s'il vous plaît... c'est loin d'être la même chose) permet aux développeurs de créer des logs ajustables de manière flexible qui peuvent être modifiés à la volée (parfait pour le dubugging). Documentation API automatisée (via javadoc). Rapports automatisés sur la couverture des tests unitaires. Des IDEs incroyables (Eclipse) avec débogueurs intégrés / autodéploiement vers des serveurs d'applications. Une API pour s'interfacer avec tous les types de services possibles, des bibliothèques open source pour faire TOUT, et un support à 100% par tous les fournisseurs.
(4) la réutilisation des services. ce que quelqu'un a commenté est vrai. Si vous avez des services lourds règles de gestion fondées sur les données alors vous pouvez argumenter que ceux-ci devraient vivre dans la couche DB. Pourquoi ? Pour éviter que le ou les niveaux intermédiaires n'aient à dupliquer cette logique.
Mais on peut dire la même chose des règles de gestion qui sont ne sont pas axés sur les données ou suffisamment complexes pour que l'OO soit un choix plus naturel. . Si vous placez TOUTE la logique commerciale dans la base de données, elle ne sera disponible que par l'intermédiaire de la base de données.
- Que se passe-t-il si vous voulez que la validation soit effectuée dans le client ou dans le niveau intermédiaire de l'application et éviter un aller-retour vers la base de données ?
- Que faire si vous souhaitez mettre en cache des données en lecture seule dans le niveau intermédiaire (pour des raisons de performances) et que les règles de gestion s'exécutent sur les données mises en cache ?
- Que faire si vous avez un service de niveau intermédiaire qui ne nécessite pas d'accès à la base de données, ou si vous avez un client qui peut fournir ses propres données ?
- Et si la partie des règles de gestion qui dépend des données doit ensuite accéder à des services externes ? Vous vous retrouvez alors avec une logique métier fragmentée qui ressemble à ceci :
i
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
Je suis sûr que nous avons tous vu des systèmes écrits comme celui ci-dessus et que nous avons dû les déboguer à deux heures du matin. Il est extrêmement difficile d'avoir une vision cohérente d'un processus complexe lorsque la logique métier est fragmentée entre les différents niveaux, et dans certains cas, la maintenance devient impossible.
1 votes
Cette question est erronée car elle ne sépare pas la logique métier orientée écriture de la logique métier orientée lecture. Plus je lis les arguments pour et contre la logique dans les procédures stockées, et plus je lis des choses comme CQRS et l'immuabilité, plus je vois que l'optimisation des écritures et des lectures nécessite des classes différentes de logique métier. Qu'est-ce que vous demandez, les deux catégories de logique d'écriture et de lecture ou une seule ?