Si j'ai toute ma logique métier dans le code et que j'utilise Entity Framework, dans quelles situations (le cas échéant) serais-je mieux de déplacer une logique métier vers une procédure stockée, au lieu de tout garder dans le code?
Pour être clair, je veux dire en conjonction avec la configuration actuelle (logique métier dans le code), pas à la place de. J'ai vu un certain nombre de questions similaires qui demandent les avantages et les inconvénients d'avoir toute la logique métier dans les procédures stockées, mais je n'ai pas trouvé grand-chose concernant l'utilisation parcimonieuse des procédures stockées pour la logique de cas de bord, tout en conservant le reste de la logique métier dans du code.
Si cela fait une différence, j'utilise MSSQL et Entity Framework.
Ce sont les situations où j'ai déjà utilisé des procédures stockées:
- Un rapport compliqué qui prenait des minutes à exécuter (c'était une page dans une application web). J'ai trouvé que je pouvais écrire du SQL beaucoup plus efficace (ne prenant que quelques secondes à exécuter) que ce que LINQ fournissait.
- Une application Web devait lire et écrire dans quelques tables d'une base de données distincte qui contenait beaucoup d'autres informations sensibles qui n'étaient pas pertinentes pour l'application. Plutôt que de lui donner accès à tout, j'ai utilisé une procédure stockée qui ne fait que ce qui est nécessaire et ne renvoie que des informations limitées. L'application Web pourrait alors avoir accès uniquement à cette procédure stockée, sans accès à des tables, etc.
Autres articles que j'ai consultés avant de poser cette question:
- Les procédures stockées sont-elles une mauvaise pratique dans l'une des plus grandes sociétés de conseil en logiciels informatiques au monde?
- Avantages et inconvénients de conserver toute la logique métier dans les procédures stockées dans l'application Web
- /programming/15142/what-are-the-pros-and-cons-to-keeping-sql-in-stored-procs-versus-code
- /dba/2450/what-are-the-arguments-against-or-for-putting-application-logic-in-the-database/2452#2452
- Quand ne pas utiliser ORM et préférer les procédures stockées?
la source
Réponses:
Vous avez déjà quelques scénarios parfaitement bons.
Il y a aussi beaucoup d'autres raisons. EF est vraiment bon au CRUD et au reporting assez simple. Parfois, cependant, EF n'est pas l'outil parfait. Voici d'autres raisons (scénarios) d'envisager l'utilisation de procédures stockées en combinaison avec Entity Framework:
Je suis sûr qu'il y en a beaucoup plus en plus. La façon de déterminer la meilleure voie à suivre dans toute circonstance particulière consiste à faire preuve de bon sens et à se concentrer sur l'objectif principal, qui devrait être d'écrire du code de haute qualité et facile à maintenir. Choisissez le ou les outils qui vous donnent ce résultat dans chaque cas.
la source
Peut-être que cela a du sens, de tourner la question et de trouver des cas où seules les procédures stockées pourraient faire, ce que vous voulez réaliser. Il existe peut-être vraiment des cas d'utilisation, où les procédures stockées se démarquent.
Mes connaissances sur EF sont limitées, mais pour autant que je puisse voir, EF est ( juste ) un ORM comme les autres; et est heureusement capable d'utiliser du SQL brut .
Si je prends vos deux points principaux:
LINQ / EF n'était pas à la hauteur lors de la rédaction d'un rapport. Et comme vous l'avez remarqué, c'était
SQL
beaucoup plus rapide que d'utiliser un ORM. Mais parle-t-il en faveur des procédures stockées ou seulement contre l'utilisation de l' ORM pour tout?Votre problème pourrait évidemment être résolu avec SQL . Si cette requête a été stockée et la version contrôlée dans votre base de code ne fait - selon votre exemple - au moins aucune différence .
Même chose ici: une simple chaîne de connexion et et UPDATE et votre problème est terminé. Ce problème pourrait être résolu même avec un ORM : il suffit d' utiliser un webservice en face de l'autre DB et la même segmentation / isolation est obtenue.
Donc rien à voir ici.
En examinant certains points que d'autres ont soulevés:
Mais
SQL
peut le faire. Pas de magie impliquée ici.Encore une fois: utilisez EF lorsque cela est approprié.
Je ne vois pas comment les procédures stockées aident. Je ne peux donc pas voir un avantage des procédures stockées; mais peut-être que quelqu'un fait la lumière là-dessus.
Encore une fois: "Limites d' EF ".
D'accord. Je pars avec un peut - être .
Jusqu'à présent, seulement un demi- point a été fait en faveur des procédures stockées.
Il existe peut-être des considérations de performances, qui parlent en faveur des procédures stockées.
1) Le stockage des requêtes présente l'avantage d'un simple appel à la procédure stockée qui résume la complexité. Étant donné que le planificateur de requêtes connaît la requête, son optimisation est "plus facile". Mais les sauvegardes se font avec le planificateur de requêtes sophistiqué actuel _minimal.
En plus de cela, même s'il y a un léger coût en utilisant des requêtes ad hoc , si vos données sont bien structurées et soigneusement indexées, la base de données n'est que le goulot d' étranglement de votre application. Donc, même s'il y a un petit delta, il est négligeable compte tenu d'autres facteurs.
2) Néanmoins, il a été plaidé pour le stockage de requêtes complexes dans une base de données. Il y a deux choses à considérer:
a) les requêtes complexes utilisent massivement l'infrastructure DB, ce qui augmente les temps de réponse pour toutes les autres requêtes. Vous ne pouvez pas exécuter de nombreuses requêtes coûteuses en parallèle . Cela ne parle ni pour ni contre les procédures stockées, mais contre les requêtes complexes .
b) Si la requête prend de toute façon du temps, pourquoi s'embêter avec de petites victoires de vitesse d'une procédure stockée.
tl; dr
Rien ne parle directement contre les procédures stockées. Il est donc acceptable d'utiliser des procédures stockées - si cela vous rend heureux.
Mais d'un autre côté: je ne pouvais pas imaginer un cas d'utilisation approprié qui parle sans équivoque pro.
La bonne réponse est: quand vous le souhaitez . Mais il existe d'autres options.
la source
Dans votre cas spécifique, étant donné que vous utilisez l'infrastructure d'entité, il convient d'envisager d'utiliser des procédures stockées lorsque l'infrastructure d'entité ne répond pas à une exigence ou à une préoccupation.
Le cadre d'entité fait un travail décent et les performances seront proches ou égales à l'utilisation de procédures stockées. Vous avez choisi le framework d'entité parce que vous ne vouliez pas vous préoccuper de SQL et laissez le framework générer le SQL pour vous.
Mais il peut y avoir un cas limite où le cadre d'entité est défaillant et ne peut pas répondre à vos besoins. Dans ce cas, on écrit le SQL à la main à l'aide d'une procédure stockée ou d'une requête paramétrée, puis on utilise le cadre d'entité pour appeler directement cette procédure stockée / instruction SQL.
Donc, je ne déplacerais rien vers une procédure stockée à moins que le cadre utilisé ne puisse pas répondre à l'exigence.
Je pense que la pire chose qui puisse arriver est que l'on choisisse d'utiliser le framework d'entité et ensuite d'écrire toutes les procédures stockées. Maintenant, on a une couche supplémentaire qui n'ajoute aucune valeur.
la source
Avoir un besoin technique n'est pas le choix le plus probable. Les programmeurs préfèrent leurs outils et sont généralement plus à même de résoudre leurs problèmes avec eux. Mettre la logique dans un sproc sera l'exception. La dette technique et les futurs développeurs devant prendre du temps pour travailler avec une exception doivent être pris en considération. Il peut y avoir une amélioration des performances dans votre SGBDR particulier qui est simplement plus facile à implémenter dans un sproc ou peut-être même un autre objet db comme une vue indexée.
Il y aura des moments où vous aurez besoin de données d'une base de données et que vous ne pourrez tout simplement pas les obtenir à partir de votre code d'application. Dans de nombreuses situations de grande entreprise / entreprise, les besoins de l'entreprise peuvent dépasser la portée du service informatique. Les entreprises sont achetées et vendues et leurs applications vont et viennent avec elles. Les agences de régulation et les banques ne se soucient pas si vous ne pouvez pas créer votre application hautement évolutive et magnifiquement codée. Ils peuvent rendre la vie difficile à l'entreprise, vous devez donc le faire.
J'ai rencontré des situations où des applications tierces ou des outils d'écriture de rapports ne vous permettent pas d'accéder à votre code. Pas de code open source, pas d'API, pas d'interface web et pas de services. La seule chose qu'ils ont est leur propre outil spécial d'écriture de rapport qui ne fonctionne qu'avec des objets de base de données: tables, vues, sprocs, fonctions définies par l'utilisateur, etc. Vous mettez la logique partout où vous pouvez y accéder.
Si vous avez un DBA qui est très bon pour écrire des procédures stockées, vous pouvez tirer parti de ce talent dans certaines situations. Vous souhaiterez peut-être déclencher une sauvegarde à partir de votre application, car vous allez apporter une modification majeure aux données, alors pourquoi ne pas utiliser ce que votre dba utilise?
Certaines demandes ad hoc sont simplement plus faciles à écrire un proc jusqu'à ce que vous puissiez obtenir toutes les fonctionnalités de votre application. Nous détestons ça. Nous repoussons, mais le spectacle doit continuer.
la source
Je déconseille fortement de placer une logique métier dans une procédure stockée. Cependant, il peut y avoir un cas (vous avez énuméré deux beaux exemples) où il est préférable d'y placer la logique d' accès aux données .
De manière générale, si vous êtes tenté d'utiliser des SP, c'est un signe (une odeur de code) laissant entendre que votre modèle de données n'est pas bien adapté à ses besoins.
Edit: Lorsque les développeurs me posent des questions sur la logique d'accès aux données / aux entreprises, je dis que la logique métier concerne le comportement et l'interaction des données, tandis que la logique d'accès aux données concerne la façon dont les données sont stockées et récupérées.
Par exemple: Dans votre modèle de domaine, vous pourriez avoir les entités "Student" et "Teacher", toutes deux dérivées de "Person". (Ne pas dire que c'est préférable, juste un exemple). Cela peut être stocké dans une base de données relationnelle sous la forme d'une, deux ou trois tables. Le choix dépend du nombre de propriétés qu'ils partagent et des exigences de performances en lecture / écriture.
Dans la logique métier, la façon dont ces entités sont stockées n'a pas d'importance. (ou s'ils résident dans un RDB). La logique d'accès aux données concerne leur stockage physique.
Donc, concernant la question d'origine: si une procédure stockée rend le stockage et la récupération de données plus efficaces (ou plus robustes), vous avez un cas. Si la procédure stockée vise simplement à imposer une règle que je valide quelle que soit la façon dont les données sont stockées, évitez-la. Cela rend votre code plus étroitement couplé à la base de données.
la source
Je pense qu'il y a trois problèmes ici.
Logique métier dans SQL est mauvaise. Même s'il s'exécute individuellement plus rapidement, il ne s'adapte pas.
Traditionnellement, les SPROC doivent toujours être utilisés pour tous les accès aux données en tant que couche d'abstraction. Permettre à un DBA d'introduire des performances ou d'autres modifications de couche de données sans affecter les applications consommatrices.
EF ne joue pas bien avec les sprocs. Vous perdrez beaucoup de «bonnes» fonctionnalités et gains de productivité en abandonnant la génération de requêtes dynamiques de Linq.
Donc, mon conseil général serait de
Utilisez des SPROC pour toutes les requêtes SQL,
N'y mettez pas de logique métier ni aucune sorte de boucle,
Ne EF utilisation.
la source