Les procédures stockées violent-elles la séparation à trois niveaux?

42

Certains de mes collègues m'ont dit que la logique métier dans les procédures stockées de la base de données enfreignait l'architecture de séparation à trois niveaux, car la base de données appartenait à la couche de données, alors que les procédures stockées étaient de la logique métier.

Je pense que le monde serait un endroit très sombre sans procédures stockées.

Est-ce qu'ils violent vraiment la séparation à trois niveaux?

Tulains Córdova
la source
9
Il suffit de leur demander s'ils n'ont pas entendu parler de l'architecture à 3 niveaux 1/2 ...
dreza
7
Rappelez-vous que les niveaux et les couches ne sont pas identiques.
NoChance
2
@ emmad-kareem Cette question m'a aidé ( stackoverflow.com/questions/120438/… ). Le problème est que la littérature technique de langue espagnole (ma langue maternelle) utilise un seul mot ("capa"), alors que l'anglais a deux mots très distincts.
Tulains Córdova
1
@ user1598390, vous avez raison, cela pourrait prêter à confusion, en particulier au fait que le monde des logiciels n’est pas assez rigoureux pour ce qui est des définitions dans une seule langue, sans parler de différentes langues.
NoChance
1
L'architecture à 3 niveaux est un concept logique, pas un concept physique. Vous pouvez implémenter des règles métier à l'aide de procédures stockées. Bien qu'elles soient physiquement dans la base de données, ces procédures stockées font toujours partie du niveau logique métier.
Craig

Réponses:

33

Vos collègues associent architecture et implémentation.

L'idée à la base d'une application multiniveau est simplement de diviser celle-ci en plusieurs parties qui encapsulent certains types de traitement (stockage, logique métier, présentation) et communiquent entre elles via des interfaces bien définies. Tout comme il est possible de réussir des choses qui ressemblent à la programmation orientée objet dans des langages non orientés objet, il est possible de faire la même chose avec plusieurs niveaux au sein d'un même environnement, tel qu'un serveur de base de données. Ce qui est commun à tous ceux qui réussissent, c'est un besoin de soin, de discipline et une compréhension des compromis en jeu.

Examinons une application à trois niveaux dans laquelle deux des niveaux ont été implémentés dans une base de données:

  • Niveau données: Consiste de tables de base de données accessible en utilisant les quatre opérations de table standard ( INSERT, UPDATE, DELETEet SELECT).
  • Niveau logique: se compose de procédures stockées qui implémentent uniquement la logique métier et accèdent au niveau données en utilisant uniquement les méthodes décrites ci-dessus.
  • Présentation Niveau: consiste en un code d'exécution de serveur Web qui accède au niveau logique en effectuant uniquement des appels de procédure stockée.

C'est un modèle parfaitement acceptable, mais il s'accompagne de compromis. La logique métier est mise en œuvre de manière à lui donner un accès rapide et facile au niveau données et peut permettre d'effectuer des tâches qui devraient être effectuées "à la dure" par un niveau logique situé en dehors de la base de données. Ce que vous abandonnez, c’est la possibilité de déplacer facilement l’un ou l’autre niveau vers un autre élément technologique et une mise en œuvre simple (vous devez faire très attention à ce que les tiers n’utilisent pas les installations disponibles dans la base de données mais en dehors de leurs interfaces définies). .

Que ce soit ce genre de choses et les compromis qu’il apporte soient acceptables dans une situation donnée, c’est quelque chose que vous et vos collègues devez déterminer en utilisant votre jugement.

Blrfl
la source
2
Je peux donc leur dire que les procédures stockées font partie du niveau logique, en termes d'architecture, indépendamment du fait qu'elles soient stockées dans la base de données?
Tulains Córdova
3
@ user1598390: oui. Bien que ce soit couche à dire 3 couches, et non 3 niveaux.
jmoreno
4
@ user1598390: Vous pouvez le dire tant que vous pouvez le prouver. La première fois que la couche de présentation SELECTest directement issue de tables (le niveau données), le modèle est cassé.
Blrfl
@blrfl C'est quelque chose dont j'ai pris soin;)
Tulains Córdova
2
@ user1598390: c'est bien, rappelez-vous simplement que l'objectif est de séparer logiquement les préoccupations, de ne pas placer les choses sur un matériel différent.
Jmoreno
19

Les procédures stockées sont suffisamment puissantes pour vous permettre de coder une violation de la séparation à trois niveaux en intégrant la logique métier dans la couche SGBDR. Cependant, il s’agit de votre décision et non d’un défaut inhérent aux procédures stockées. Vous pouvez limiter vos SP à répondre aux besoins de votre couche de données tout en conservant la logique de votre application dans la couche d'application de votre architecture.

Il existe une exception rare mais importante à la règle de séparation, lorsque vous avez besoin de procédures stockées (en particulier d'un groupe de déclencheurs) pour contenir la logique métier. Cela se produit lorsque votre application doit générer de nombreuses agrégations de données à la volée qui touchent des millions de lignes. Dans de tels cas, des déclencheurs peuvent être configurés pour conserver des données pré-agrégées pour une utilisation de la couche de gestion. Cela ne devrait être fait que dans des situations où, sans pré-agrégation, votre application serait trop lente.

dasblinkenlight
la source
7
+1 pour indiquer que vous souhaitez parfois qu'une logique vive dans la base de données pour des raisons de performances, car un SGBDR définit généralement les ordres de grandeur des opérations plus rapidement que le code de votre application. Bien que ce ne soit évidemment que lorsque les performances sont critiques et que le code des applications ne permet pas de les atteindre, la grande majorité des applications modernes protégées par une base de données sont des applications CRUD et ne servent à rien pour de tels avantages.
Jimmy Hoffa
1
Amen. Les gens semblent penser que sprocs = business "code". Ils doivent être considérés comme une "API" de base de données, et ils ont alors beaucoup plus de sens. Bien sûr, ils peuvent également résoudre les cas extrêmes où vous avez également besoin des performances de votre logique!
gbjbaanb
5

Le conseil d'Atwood de 2004 sonne vrai encore aujourd'hui, à présent seulement, nous bénéficions également de l'ORM.

http://blog.codinghorror.com/who-needs-stored-procedures-anyways/

Les procédures stockées doivent être considérées comme un langage d'assemblage de base de données: à utiliser uniquement dans les situations les plus critiques en termes de performances. Il existe de nombreuses façons de concevoir une couche d'accès aux données solide et hautement performante sans recourir aux procédures stockées; vous obtiendrez de nombreux avantages si vous vous en tenez au SQL paramétré et à un environnement de développement cohérent unique.

Patrick Szalapski
la source
Au cours de mes 20 années d’expérience dans une grande entreprise, les procédures stockées ne sont pas utilisées pour renvoyer des lignes (les vues sont utilisées pour cela), ni pour chaque simple insertion ou mise à jour (inline SQL est utilisé pour cela). Ils sont principalement utilisés pour des opérations longues ne nécessitant aucune interaction de l'utilisateur, nécessitant l'itération de grands ensembles de données pour résumer et effectuer des insertions ou des mises à jour basées sur une logique métier, par rangée, telles que les fermetures de fin de mois ou le traitement quotidien par lots des transactions. . L'auteur de l'article semble avoir utilisé des procédures stockées pour renvoyer des lignes et c'est pourquoi il les chauffe.
Tulains Córdova
3

Bref résumé: Cela dépend vraiment de votre utilisation des procédures stockées et des exigences de l’entreprise.

Un certain nombre de projets utilisent une architecture à trois niveaux et, selon la nature des besoins de l'entreprise, il peut être nécessaire de déplacer certaines opérations vers un niveau de données.

En parlant de terminologie, ces niveaux sont décrits comme suit:

  • Le niveau présentation , ou couche de services utilisateur, permet à un utilisateur d'accéder à l'application.
  • Le niveau intermédiaire , ou couche de services métier, est composé de règles métier et de règles de données.
  • Le niveau de données , ou couche de services de données, interagit avec les données persistantes généralement stockées dans une base de données ou stockées de manière permanente.

Généralement, pour l’architecture donnée, la couche de services intermédiaires ou d’entreprise comprend des règles de gestion et de données. Cependant, il est parfois très important de déplacer des opérations de base et / ou des règles de données lourdes dans le niveau données - à travers un ensemble de procédures stockées.

Les avantages des conceptions à trois niveaux sont les suivants:

Durant le cycle de vie d'une application, l'approche à trois niveaux offre des avantages tels que la réutilisabilité, la flexibilité, la facilité de gestion, la maintenabilité et l'évolutivité. Vous pouvez partager et réutiliser les composants et services que vous créez, et vous pouvez les distribuer sur un réseau d'ordinateurs, selon vos besoins. Vous pouvez diviser des projets volumineux et complexes en projets plus simples et les affecter à différents programmeurs ou équipes de programmation. Vous pouvez également déployer des composants et des services sur un serveur pour suivre le rythme des modifications. Vous pouvez également les redéployer à mesure que la base d'utilisateurs, les données et le volume de transactions de l'application augmentent.

Il s’agit donc vraiment d’une approche fondée sur la jurisprudence qui comporte des compromis en soi. Toutefois, les directives de conception Microsoft du modèle d' architecture à trois niveaux recommandent de conserver votre logique métier au niveau intermédiaire.

EL Yusubov
la source
2

Tier signifie en réalité une machine différente, couche signifie une séparation logique différente. Avec les procédures stockées, vous avez la couche de données et (au moins une partie) la couche de logique applicative dans le même niveau. L'insertion de la logique métier dans les procédures stockées constitue une violation de l'architecture à 3 contraintes, mais on peut se demander si elle enfreint une architecture à 3 couches. Une chose est sûre: ce n'est certainement pas un bon exemple de séparation des préoccupations.

Une couche est un mécanisme de structuration logique des éléments constituant votre solution logicielle. un niveau est un mécanisme de structuration physique de l'infrastructure système. ( Référence )

À mon avis, la construction de la logique métier dans la base de données pose deux problèmes majeurs:

  1. Code et bibliothèques: vous constaterez que moins de programmeurs sont capables de programmer en SQL, PL / SQL, TSQL, etc. qu'en C #, Java, etc. Les langages de programmation ont également l'avantage de créer des IDE, des bibliothèques et des frameworks de grande qualité.

  2. Évolutivité horizontale: la seule façon de faire évoluer votre système consiste à changer le serveur physique sur lequel se trouve la base de données avec un système plus puissant, ce qui est plutôt coûteux (un serveur doté de 64 Go de RAM); Les bases de données relationnelles ont une échelle horizontale très mauvaise, et même avec des dépenses plus importantes. Cependant, avec la logique métier dans un serveur construit en mode OO, vous pouvez très bien évoluer horizontalement en plaçant le serveur sur de nombreux nœuds (en Java, de nombreux serveurs d'applications le prennent en charge).

m3th0dman
la source
-1

Nous avons eu ce débat dans notre bureau il y a quelques temps, je favorisais le développement de base de données, j'ai un avis suivant à ce sujet

  1. Si vous utilisez Oracle Database, vous devez utiliser autant que possible PL / SQL, car les entreprises qui investissent resteront sûrement fidèles à Oracle au moins 10 ans à compter de maintenant. Hier, dans les applications, vous utilisiez Oracle Forms, aujourd'hui, des formulaires Web .net, puis MVC, puis demain, vous utiliserez angularjs et aurez simplement besoin d'un apis reposant. Si votre base de données contient le maximum de logique, vous pouvez facilement migrer vers les nouvelles technologies front-end.
  2. Le développement de la base de données est très rapide et très efficace en termes de performances. Juste pour vous donner une perspective. Dans notre projet, il y avait 7 développeurs d'applications et un développeur de base de données, et 80% de la logique était dans la base de données.
  3. Si vous utilisez oracle, vous pouvez utiliser des utilitaires pour convertir directement vos procédures de base de données en Ap full.

L’argument le plus puissant que les développeurs d’applications lui donnent est que la logique d’entreprise doit être indépendante de la base de données pour que vous puissiez facilement la modifier. Je pense que si une entreprise utilise oracle pour savoir pourquoi elle optera pour une autre technologie, les chances d'obtenir une logique d'application obsolète sont plus probables. Le problème est principalement lié aux nouveaux talents de la base de données qui manque, principalement aux types de site Web simples où ils utilisent mysql ou sqlserver. Ces types deviennent alors des responsables principaux et ont un attachement émotionnel avec la couche d’application :) ils ne veulent même pas comprendre ni débattre.

Farhan Ali
la source
"Si vous utilisez Oracle Database, vous devez utiliser autant que possible PL / SQL", les procédures stockées ajoutent de la charge à ce qui est généralement le système le plus encombrant et le plus difficile à faire évoluer dans une architecture. Ils sont également difficiles à gérer du point de vue du contrôle de version et des tests unitaires. "Parce que les entreprises qui investissent resteront sûrement fidèles à Oracle au moins 10 ans à compter de maintenant." C'est juste un non-sens. Qu'est ce qui te fait penser ça? Si vous remplissez votre système avec des ordures procédurales PL / SQL stupides, vous pouvez empêcher une entreprise de passer à quelque chose de contemporain. Cela pourrait être vrai.
JimmyJames