Il y a toujours un débat sur le sujet - "Faut-il mettre la logique métier dans la procédure stockée ou pas?". Si nous décidons de ne pas utiliser l'outil ORM et de ne pas mettre la logique métier dans la procédure stockée, alors où devrions-nous mettre la logique métier?
Dans mes applications précédentes, j'ai toujours préféré mettre toute la logique métier dans les procédures stockées uniquement. Ensuite, à partir du code .NET, j'appelle ces procédures stockées à l'aide de blocs d'application d'accès aux données. SQLHelper etc. Mais cela ne peut pas être le scénario tout le temps. J'ai donc fait quelques recherches sur Google mais j'ai fini dans la confusion .......
Des suggestions ...?
Réponses:
J'adopterais une approche pragmatique - historiquement, le principal `` avantage '' de conserver la logique métier dans les processus stockés est pour des raisons de performances (architecture à 2,5 niveaux), tandis que la séparation de la logique métier en un niveau BLL (niveau 3 / N) est généralement plus propre qu'un perspective de maintenance, et plus facile à tester (Mock / Stub sur l'accès aux données).
Cependant, étant donné que les ORMS .NET compatibles LINQ tels que LINQ2SQL, EF et NHibernate créent désormais des requêtes SQL paramétrées, où les plans de requête peuvent être mis en cache, sont échappés pour l'injection SQL, etc., je suppose que le passage à une architecture de niveau 3 / N est plus convaincant que jamais, et la plupart des SPROC (en particulier ceux centrés sur les requêtes) peuvent être évités. Les modèles de référentiel dans .NET exposent généralement les paramètres de l'arborescence des expressions IQueryable / accept, permettant un accès sécurisé mais flexible à vos tables. (Personnellement, dans les architectures de type SOA, je n'exposerais pas IQueryable au-delà du BLL, c'est-à-dire que vos niveaux de service et de présentation devraient fonctionner avec un ensemble de méthodes bien défini. La raison en est qu'autrement, vous ne pourrez jamais tester complètement votre système et vous aurez gagné ''
Cependant, dans un système de taille décente, il y aura toujours quelques exceptions, où un morceau de code très intensif en données devra peut-être encore être écrit en tant que Proc stocké pour des raisons de performances. Dans ces cas, je conserverais le SPROC et exposerais le SPROC via l'ORM, mais j'exposerais toujours la fonction comme méthode d'intercommunication sur votre BLL.
la source
En tant que développeur Java, ma préférence était de mettre la logique métier dans le BLL (contrôle de source agréable et facile, familiarité, etc., etc.).
Cependant, après avoir travaillé pour une grande entreprise avec de nombreuses applications distribuées utilisant différentes technologies (C #, Java, Pick (ne demandez pas)), un avantage significatif de l'utilisation des procédures stockées est devenu apparent:
Les procédures stockées peuvent être partagées entre différentes applications .
la source
Notre équipe a une règle douce ici. Parfois, il est préférable de résoudre la logique métier en T-SQL, parfois il est plus facile de le faire en c # (couche métier).
Nous avons donc une solution pragmatique: mettre là où cela convient le mieux. Je sais que la théorie est parfois très stricte à ce sujet ... mais c'est la théorie :-)
la source
Il y a des avantages et des inconvénients pour les deux (à mon avis):
Les procédures stockées peuvent devenir un cauchemar si vous n'utilisez pas une sorte de contrôle de source SQL (ce que beaucoup d'endroits n'utilisent pas) et que plusieurs développeurs y travaillent. Quelqu'un peut modifier une procédure stockée et oublier de mettre à jour le code qui appelle cette procédure et avant de le savoir, vous venez de créer et de déployer un site qui va lever des exceptions non gérées (incompatibilité du nombre de paramètres, etc.).
D'un autre côté, les procédures stockées permettent des corrections de bogues plus rapides dans certaines situations. S'il y a un bogue avec une procédure stockée, il suffit de le corriger et vous avez terminé. Une correction de bogue dans un ORM nécessite une reconstruction. Selon votre processus de construction, cela peut être long / ennuyeux.
la source
Nous mettons toujours notre logique métier dans la couche logique métier. Si vous le mettez dans la procédure stockée, il sera perdu une fois que vous aurez changé votre SGBDR.
la source
La «logique métier» est un peu vague. Je veux dire qu'il n'a pas de définition unique. Une règle d'or consiste à minimiser la communication entre les niveaux lorsque vous le pouvez. Ainsi, vous n'avez pas besoin d'envoyer un nom de client vide au serveur pour le vérifier avant d'insérer une ligne.
Il existe des cas, lorsqu'une règle est basée sur une lecture de base de données. Supposons que vous souhaitiez transférer de l'argent du compte 1 vers le compte 2. Vous devez lire les deux comptes, vous assurer qu'ils sont en bon état et que le montant du compte 1 est suffisant. Dans ce cas, le serveur est un meilleur candidat pour cette règle car le client (qui est le BL ici) n'a pas besoin d'émettre 3 appels au niveau base de données pour ce processus.
Bien sûr, si vous avez besoin que votre solution soit indépendante de la base de données, faites des procs stockés uniquement pour CRUD (le cas échéant).
la source
La logique doit toujours être dans le BLL car:
Je pense qu'il devrait y avoir une loi qui stipule qu'après qu'un SP fait plus de X lignes, il ne fonctionne pas comme prévu.
la source
Nous créons une couche de services qui contient toute notre logique métier implémentée dans la langue choisie et utilisons uniquement la base de données pour les requêtes. Cette approche est en quelque sorte mandatée par nous car notre objectif est de créer des solutions COTS pour fournir des applications avec diverses implémentations de bases de données. Hibernate s'est avéré être une bouée de sauvetage pour nous dans ces circonstances.
Je pense que le plus grand avantage de cette approche, outre la portabilité de la base de données, est que vous pouvez trouver toutes vos réponses en une seule recherche.
De plus, malgré certaines des réponses à un forum, j'ai un ami travaillant pour une compagnie d'assurance Fortune 100 qui a effectué 2 conversions de base de données en trois ans parce que la base de données de choix pour la société a changé.
la source
Dans mon expérience limitée, je préfère maintenir l'intégrité des données avec des procédures stockées et d'autres fonctionnalités de base de données. Par exemple, si j'implémentais un transfert de fonds entre deux comptes, j'écrirais une procédure stockée. Je trouve utile de pouvoir utiliser plusieurs langages d'application.
la source