Je envisage actuellement des options de conception pour une application de rapport basée sur un jeu de données existant. P>
Il existe plusieurs possibilités claires pour la réutilisation du code étant donné que bon nombre des rapports doivent utiliser le même jeu de données de base (édité). P>
La tempation est de créer une procédure stockée de base que je peux réutiliser tout au long de ce système, cependant, le contrat que j'étais il y a 6 mois ou m'a donc montré ce que le côté bas de cette pratique - plusieurs couches d'appels de procédures stockées. Renvoyer des sous-ensembles de données dans, rendant très très difficile l'entraînement de ce qui se passait, déboguer et tester. P>
Je suis ces jours-ci de l'avis que la réutilisation du code n'oublie pas nécessairement la maintenabilité dans la conception de la base de données. P>
Je cherche une idée de cela à partir d'un serveur SQL Dev plus expérimenté que moi? P>
Merci d'avance. P>
3 Réponses :
Disclaimer: Ce n'est pas un "N'utilisez pas de procédures stockées - Pensez aux enfants!" Poste, et je ne vise pas à enflammer une guerre de flamme. Je suggère simplement que la réutilisation du code est plus facile et éventuellement plus adaptée à certaines situations et à certaines plates-formes que d'autres. Em> p>
La réutilisation du code comme concept améliore généralement une base de code. Vous gardez des choses Dry et commencez à former une couche de fonctionnalité courante pour résoudre des problèmes courants dans de la même manière. p>
Cependant, comme n'importe quoi, on peut le faire mal (le pouvoir vient la responsabilité de Blah Blah Blah). P>
C'est relativement simple dans la plupart des langages de programmation modernes pour réutiliser le code, soit en écrivant des fonctions, soit même de créer des cadres entières pouvant être utilisés à nouveau et à nouveau. Cependant, dans T-SQL, c'est Tricksy parce que vous avez moins d'options. Les procédures stockées peuvent le faire, mais vous avez vu à quel point ils peuvent être maladroits. P>
Ma préférence personnelle est de garder la logique commerciale hors de la base de données. Cela signifie que je n'utilise pas de vues, UDF, SproCs, etc. (sauf après le profilage de la performance, nous pensons que nous pouvons accélérer quelque chose à l'aide de ces techniques) et la conserver dans mon code d'application. Cela provoque souvent des pensées d'une "couche logique d'entreprise", mais il y a diverses saveurs de cela, donc c'est probablement un abu. Ce n'est certainement pas un code directement derrière le bouton UI cliquant sur les gestionnaires et ainsi de suite, cependant. P>
Je vis de limiter la base de données à stocker et à récupérer des données, car c'est ce qu'ils sont réassocialement bons à. Nous savons tous à quel point T-SQL clunky et obsolète peut être comme une langue (pensez à la manipulation d'exception, au déploiement, aux curseurs, etc.). Être de base de données-agnostique est tout à fait impossible si votre demande est écrite dans la base de données elle-même et que vous ne pouvez pas également modifier votre application, car la base de données est em> l'application. Si vous avez cette logique commerciale dans le code de l'application, elle peut être réduite beaucoup plus facilement. P>
Dans ce cas, la "logique commerciale" est la requête et les transformations utilisées pour générer vos rapports, et j'éditionnerais comment il pourrait être possible de réutiliser le code de votre outil / code de reporting avant d'envisager d'autres options. P>
Je suis d'accord avec tout ce que vous dites. Cela semble-t-il si vous préférez que vous préférez Inline SQL sur les procédures stockées? La performance souffrirait trop dans mon cas pour cela. De plus, j'accepte particulièrement de garder la logique commerciale à partir d'une base de données, mais le compromis ici est que les transformations de la couche logique des entreprises ne sont pas aussi efficaces et peuvent nécessiter plusieurs voyages ronds dans la base de données. Cela signifie que la logique commerciale est inévitablement finie dans la base de données de mes applications. Je pense aussi que les bases de données sont d'excellents endroits pour appliquer les règles commerciales via des contraintes.
Je ne m'approche pas dans un argument "SproS n'est pas beaucoup plus rapide", mais je vous suggère de mesurer la performance des deux avant de supposer que cela. Il était une fois c'était vrai, mais comme profession, nous devons remettre en question ces anciennes hypothèses. Les optimisateurs de requête et la mise en cache de plan de requête Ces dernières années négatirent pratiquement tout avantage des requêtes compilées / Sprates. Les transformations sont également peu susceptibles d'être beaucoup plus rapides, car vous pouvez gâcher la capacité de la base de données à planifier efficacement. En outre, les contraintes ne sont pas des règles commerciales - ce sont des règles d'intégrité des données.
C'est à dire. Ce sont des chevaux pour des cours - assurez-vous simplement que vous avez mesuré et prouvé votre approche plutôt que de faire des hypothèses. Pour tous ceux qui peuvent prouver ce que j'ai dit ci-dessus, il y aura quelqu'un qui est en désaccord et peut le prouver aussi. Vous devez prouver i> ces hypothèses et attirer vos propres conclusions pour votre situation et vos exigences particulières.
Je ne vais pas contester quoi que ce soit que vous dites. Le marquage de banc doit être fait dans chaque contexte où la performance est la clé. J'aime garder la séparation des données et du processus (j'espère que cela a du sens). Si je veux un ensemble de données, je pense que c'est une préoccupation de base de données et devrait être traitée par la base de données. Je ne dis pas qu'il n'y a pas de descente à cela - ma question concerne le fait qu'il existe des descentes évidentes à cela. Je pense que je dois me concentrer sur la gestion du code dans la base de données ici, bien que je comprenne votre point completley.
Je vais marquer cela la réponse, comme s'il ne donne pas une résolution parfaite (il semble que personne n'existe), il répond à la préoccupation dans ma question - si la facilité de gestion du code et la réutilisation de la conception de la base de données est une préoccupation principale, évitez totalement, même si le coût est la performance.
"Les contraintes ne sont pas des règles commerciales - ce sont des règles d'intégrité des données" - Oh, homme. Une ligne est une règle d'entreprise!
Les contraintes sont là pour garder vos données droites. Ils sont une dernière station et ne sont pas le bon endroit pour faire respecter la règle des affaires. Une règle d'entreprise nécessitant une référence d'ordre soit unique ne doit pas être mise en œuvre en capturant SQLException code>, il doit être mis en œuvre en vérifiant dans la base de données pour la référence de commande et en informant l'utilisateur si vous trouvez qu'il existe une utilisation utile. message. La contrainte de DB n'est qu'un dernier recours pour empêcher les bugs / l'oubli de gâcher l'intégrité de vos données.
En premier lieu, c'est un mythe de cette base de données. T-SQL échelle plus rapide lorsqu'il est écrit par de bons développeurs ayant des connaissances sur SQL Server. Si l'on garde SQL dans le code de l'application, comment traiterait-on une donnée de processus? C # ou Java n'est pas conçu pour traiter les données. C'est SQL (une langue définie) qui est conçue pour utiliser l'optimiseur et si vous traitez des données à l'aide de la construction C # ou Java, vous vaincuez le but d'utiliser une base de données. Les contraintes sont des règles commerciales et doivent être dans la base de données. Pourquoi? Parce que DB Kernel Code est bien plus intelligent que vous ne gérez les données.
L'objectif principal de la réutilisation du code, de l'OMI, est de casser des programmes monolithiques dans des pièces plus facilement comprises et plus facilement maintenues. La division du travail ne doit pas être idiosyncratique - l'idée originale d'ordre personnel d'un homme. L'art de construire une bibliothèque de fonctions d'assistance est en très grande partie un art social - vous devez définir une API intelligible qui est cohérente dans son approche. Vous ne voulez pas que les codeurs qui suivent après que vous vous maudissez en absentia. Vous voulez qu'ils vous remercient pour la clarté et l'utilité de votre conception. P>
@Neil Barnwell: Je ne vois aucun problème de construire des règles commerciales dans la base de données. Les déclencheurs et les PROC stockés peuvent également effectuer ce rôle, sinon mieux qu'un code de niveau moyen ou client. Bien sûr, vous devez avoir des programmeurs qui ont maîtrisé le langage de programmation dans la base de données, T-SQL ou PL / SQL ou quoi que ce soit. P>
J'ai vu et j'ai fait les deux et je sais que pour une application d'entreprise professionnelle de taille raisonnable, elle s'avère toujours une erreur massive plus loin dans la ligne. Il y a tellement de raisons pour lesquelles je ne vais pas les énumérer ici. C'est une guerre religieuse, ce qui signifie par définition, il ne peut jamais être gagné. Tant qu'il n'y ait aucune hypothèse et que des conclusions scientifiques sont tirées de véritables observations, alors il convient de faire la bonne chose compte tenu de ses circonstances.
Peut-être que vous pourriez envisager d'être un peu plus conservateur avec des commentaires tels que «Les déclencheurs et les procs stockés peuvent effectuer ce rôle tout aussi bien si ce n'est pas mieux b> d'un code de niveau moyen ou de client». Vous comparez l'archaïque T-SQL favorablement aux langues modernes et plus puissantes telles que Java ou C #, qui est très difficile à prouver.
@Neil. J'ai dit que les règles applicables dans la DB peuvent être aussi bonnes que ou mieux que de le faire dans un autre niveau. Vous dites que l'application des règles dans la base de données est une «erreur massive», puis dites-moi que i i> devrait être plus conservateur dans mes prononçages! T-SQL et PL / SQL ont été étroitement intégrés aux opérations définies depuis des décennies. Les langues oo ont joué un retard dans ce respect particulier. J'utilise c # tout le temps et j'adore; certainement pas panoramique oo. Il suffit de dire que cela peut être surchargé pour appliquer des règles commerciales lorsque la simple logique conditionnelle et une boucle suffiront généralement.
La réutilisation du code dans TSQL doit être prise sur une case par base de cas. Vous devez avoir l'habitude de vérifier les plans d'exécution pour toutes les requêtes que vous écrivez pour déterminer si le plan semble raisonnable ou non. P>
Entrant de vue sur les vues peut fonctionner correctement ou peut provoquer des inefficacités en fonction de leur définition. P>
Les fonctions valorisées de la table en ligne peuvent être un moyen extrêmement bon de la réutilisation du code. Ils évitent des problèmes de prédicats possibles avec des vues et sont étendus par la requête Optimiseur, ils vous permettent d'appliquer des filtres aux résultats plus efficacement que d'essayer de faire la même chose avec une instruction multit TVF ou une procédure stockée. P >
"Je suis ces jours-ci de l'avis que la réutilisation du code n'oublie pas nécessairement la maintenabilité dans la conception de la base de données." La principale question est la suivante, le reste du texte est pour le contexte.
Y a-t-il une raison quelconque de la limitation spécifique dans le titre de procédures stockées? Ce ne sont pas le seul mécanisme de réutilisation du code.
Pas vraiment. Je comprends qu'il y a plusieurs façons de réutiliser le code.
Par exemple, j'ai une procédure stockée qui renvoie un ensemble de données spécifique (rapport 1) montrant l'historique des comptes clients. Le nouveau jeu de données (rapport 2) dont j'ai besoin est très similaire, mais il suffit d'un sous-ensemble de ces données. Pour tirer toutes les données à l'aide du rapport d'origine est inefficace, car je n'ai pas besoin de tout le jeu de résultats. De plus, si ce rapport d'origine est modifié, il peut casser mon nouveau rapport. En plus de cela, si un nouveau développeur souhaite comprendre le rapport 2, il doit également comprendre le rapport 1. Lorsque plusieurs SproCs / vues / fonctions sont combinés pour créer de nouveaux ensembles de données, cela devient moins gérable.