9
votes

Quelle logique commerciale devrait être dans la base de données?

Je développe une application multi-utilisateur qui utilise une base de données (PostgreSQL-) pour stocker ses données. Je me demande combien de logique je devrais passer dans la base de données?

E.g. Lorsqu'un utilisateur va enregistrer certaines données, il vient d'entrer. Si l'application envoie simplement aux données à la base de données et que la base de données décide si les données sont valides? Ou la demande doit-elle être la partie intelligente de la ligne et vérifier si les données sont ok?

Dans le dernier projet (commercial) que j'ai travaillé, la base de données était très déchargée. Pas d'intrigue, pas de vue, etc., tout était gouverné par l'application. Je pense que c'est très mauvais, car chaque fois qu'une certaine table a été accompagnée dans le code, il y avait le même code pour vérifier si l'accès est valide répété encore et encore.

En déplaçant la logique dans la base de données (avec des fonctions, des trigeurs et des contraintes), je pense que nous pouvons économiser beaucoup de code dans l'application (et beaucoup d'erreurs potentielles). Mais j'ai peur de mettre à peu près la logique d'entreprise dans la base de données sera un boomerang et un jour, il sera impossible de maintenir.

Y a-t-il des directives approuvées par la vie réelle à suivre?


0 commentaires

11 Réponses :


0
votes

E.g. Quand un utilisateur va sauver quelques données qu'il vient d'entrer. Devrait le application envoyez simplement les données au la base de données et la base de données décide si Les données sont valides? Ou si le application soit la partie intelligente dans la ligne et vérifiez si les données sont ok?

Il est préférable d'avoir la validation à l'extrémité avant ainsi que du côté serveur. Donc, si les données sont invalides, l'utilisateur sera notifié immédiatement. Sinon, il devra attendre que la DB réponde après un post retour.

Lorsque la sécurité est concernée, il est préférable de valider les deux extrémités. Extrémité avant ainsi que dB. Ou comment la DB peut-elle faire confiance à toutes les données envoyées par l'application; -)


0 commentaires

-1
votes

La validation doit être effectuée sur le côté client et le côté serveur et une fois que cela est valide, il doit être stocké.

Le seul travail que la base de données devrait faire est une logique interrogée. Donc, mettez à jour les lignes, l'insertion de lignes, sélectionne et tout le reste doit être géré par la logique côté serveur, car c'est là que la viande réelle de l'application vit.

La structuration de votre insert traitera correctement toutes les contraintes de clé étrangère. Obtenir la logique de votre entreprise pour appeler une SPROC insérera des données dans le format correct. Je ne considère pas vraiment cette validation, mais certaines personnes pourraient.


2 commentaires

Souhaitez-vous envisager une clé étrangère comme validation, je me demande? Ce n'est pas clair de votre réponse. Peut-être que vous pourriez élaborer?


Je ne considérerais pas le formulaire de validation FK un élément de validation de FK, car si vous structurez votre SPROC pour insérer correctement, tout ira bien. Si vous gérez un magasin de données NOSQL (Facebook, Amazon), vous ne pouviez pas compter sur les clés étrangères. Mise à jour de ma réponse



3
votes

Je trouve que vous devez valider à la fois l'avant (soit le client GUI, si vous en avez un, ou le serveur) et la base de données.

La base de données peut facilement affirmer pour NULLS, les contraintes de clé étrangère, etc. I.e. Que les données sont la forme appropriée et reliées correctement. Les transactions appliqueront les écrivies atomiques. Il incombe à la base de données de contenir / de retourner des données dans la forme .

Le serveur peut effectuer des validations plus complexes (par exemple, il ressemble à un courrier électronique, est-ce que ceci ressemble à un code postal, etc.), puis de ré-structurer l'entrée pour l'insertion dans la base de données (par exemple, normaliser-la et créer les entités appropriées pour insertion dans les tables).

où vous mettez l'accent sur la validation dépend dans une certaine mesure sur votre demande. par exemple. Il est utile de valider un code postal (dire) dans un client d'interface graphique et de fournir immédiatement des commentaires, mais si votre base de données est utilisée par d'autres applications (par exemple une application aux adresses de bulkload), votre couche entourant la base de données doit également valider. Parfois, vous finissez par fournir une validation dans deux implémentations différentes (par exemple dans ce qui précède, peut-être un front-end javascript et un backend Java Dao). Je n'ai jamais trouvé une bonne solution stratégique à cela.


0 commentaires

13
votes

Si vous n'avez pas besoin d'une évolutivité répartie massive (pensez aux entreprises avec autant de trafic que Amazon ou Facebook, etc.), le modèle de base de données relationnelle va probablement suffire à vos besoins de performance. Dans ce cas, en utilisant un modèle relationnel avec les clés primaires, clés étrangères, les contraintes ainsi que les transactions rend beaucoup plus facile de maintenir l'intégrité des données, et réduit le montant de la réconciliation qui doit être fait (et croyez-moi, dès que vous arrêtez d'utiliser tout de ces choses, vous aurez besoin de la réconciliation - même avec eux, vous aurez probablement à cause de bogues) .

Cependant, la plupart du code de validation est beaucoup plus facile d'écrire dans des langues comme C #, Java, Python, etc. que dans des langues comme SQL parce que c'est le genre de chose qu'ils sont conçus pour. Cela inclut des choses comme la validation des formats de chaînes, les dépendances entre les champs, etc. Je tendraient à le faire dans le code « normal » plutôt que la base de données.

Ce qui signifie que la solution pragmatique (et certainement celui que nous utilisons) est d'écrire le code où il est logique. Laissez la base de données poignée intégrité des données parce que ce qu'il est bon à, et que la validité des données de poignée de code « normal » parce que ce qu'il est bon. Vous trouverez un tas de cas où cela ne se vérifie pas, et où il est logique de faire des choses dans différents endroits, donc juste être pragmatique et la peser sur un cas par cas.


0 commentaires

1
votes

Utiliser les caractéristiques communes des bases de données relationnelles, telles que les contraintes de clé primaire et étrangère, les déclarations de données de données, etc. ont un bon sens. Si vous n'allez pas les utiliser, ils pourquoi se soucier d'une DB relationnelle?

Cela dit, Toutes les données doivent être validées à la fois pour les règles de type et d'entreprise avant qu'elle ne frappe la DB. La validation de type n'est que de la programmation défensive - suppose que les utilisateurs doivent vous pirater, puis vous obtiendrez moins de surprises désagréables. Les règles commerciales sont ce que votre demande est tout à fait. Si vous les faites partie de la structure de votre DB, ils deviennent beaucoup plus étroitement liés à la façon dont votre application fonctionne. Si vous les mettez dans la couche d'application, il est plus facile de les modifier si les exigences de l'entreprise changent.

En tant que considération secondaire: les clients ont souvent moins de choix sur lesquels DB qu'ils utilisent (PostgreSQL, MySQL, Oracle, etc.) dont ils sont disponibles. Donc, s'il y a de bonnes chances que votre demande soit installée sur de nombreux systèmes différents, votre meilleur pari est de vous assurer que votre SQL est aussi standard que possible. Cela peut signifier que la construction de fonctions DB agnostiques linguistiques telles que des déclencheurs, etc. Sera plus de problèmes que de mettre la même logique dans votre couche d'application.


0 commentaires

1
votes

Cela dépend de l'application :)

Pour certaines applications, la base de données idiote est la meilleure. Par exemple, les applications de Google exécutées sur une base de données Big Dumb qui ne peuvent même pas se joindre car la nécessité d'une évolutivité incroyable de pouvoir servir des millions d'utilisateurs.

D'autre part, pour une application interne d'entreprise, il peut être bénéfique d'aller avec une base de données très intelligente, car celles-ci sont souvent utilisées dans une application plus qu'une simple application et que vous souhaitez donc un point de contrôle unique - Pensez à la base de données des employés.

Cela dit si votre nouvelle application est similaire à celle du précédent, j'irais avec la base de données stupide. Afin d'éliminer tous les contrôles manuels et le code d'accès à la base de données, je suggérerais d'utiliser une bibliothèque orm telle que hibernate pour Java. Il automatisera essentiellement votre couche d'accès aux données mais laissera toute la logique à votre application.

En ce qui concerne la validation, il faut faire à tous les niveaux. Voir d'autres réponses pour plus de détails.


0 commentaires

4
votes

Deux cents: Si vous choisissez intelligent, rappelez-vous de ne pas aller dans le champ "Trop intelligent". La base de données ne doit pas traiter d'incohérences inappropriées pour son niveau de compréhension des données.

Exemple: Supposons que vous souhaitiez insérer une adresse électronique valide (vérifiée avec un courrier de confirmation) dans un champ. La base de données pourrait vérifier si l'e-mail est réellement conforme à une expression régulière donnée, mais demandant à la base de données de vérifier si l'adresse e-mail est valide (par exemple, vérifier si le domaine existe, envoyant l'e-mail et gérant la réponse) C'est un peu trop.

Ce n'est pas censé être un exemple de cas réel. Il suffit de vous illustrer qu'une base de données intelligente a de toute façon une base de données intelligente dans sa smartness, et si une adresse électronique inexistante y apporte, les données ne sont toujours pas valides, mais pour la base de données conviennent. Comme dans le modèle OSI, tout devrait gérer les données à son niveau de compréhension. Ethernet ne se soucie pas si cela transportait ICMP, TCP, s'ils sont valides ou non.


0 commentaires

1
votes

Un autre élément de considération est le déploiement. Nous avons une application où le déploiement de la base de données change est en fait beaucoup plus facile pour des installations distantes que la base de code réelle est. Pour cette raison, nous avons mis beaucoup de code d'application dans les procédures stockées et les fonctions de la base de données.

Le déploiement n'est pas votre considération n ° 1, mais il peut jouer un rôle important dans la décision de DÉPIDER B / T divers choix


0 commentaires

1
votes

C'est autant une question de personnes que la question de la technologie est une question technologique. Si votre application est la seule application qui consiste à manipuler les données (ce qui est rarement le cas, même si vous pensez que c'est le plan), et que vous n'avez que des codeurs d'application à la main, alors par tous les moyens de garder toute la logique dans l'application.

D'autre part, si vous avez des dabas qui peuvent le gérer, ou si vous savez que plus d'une application devra avoir son accès validé, puis la gestion des données en réalité dans la base de données a beaucoup de sens.

Rappelez-vous cependant que les meilleures choses pour que la base de données soit validant sont a) les types de données et b) des contraintes relationnelles, que tout ce qui s'appelant sur des SGBD doit avoir une poignée de toute façon.

Si vous avez des transactions dans votre code de demande, il convient également de vous demander si elles devraient être poussées à la base de données en tant que procédure stockée afin qu'il soit impossible pour eux d'être incorrectement réimplexés ailleurs.

Je connais des magasins où le seul accès autorisé à la base de données se fait via des procédures stockées. Les DBA ont donc une réponse complète pour la sémantique de stockage de données et les restrictions d'accès au stockage de données et que quiconque doit passer par leurs passerelles. Cela présente des avantages évidents à ce sujet, surtout si plus d'une application doit avoir accès aux données. Que vous soyez assez loin, c'est à vous, mais c'est une approche parfaitement valide.


0 commentaires

-2
votes

Ma décision est la suivante: Ne jamais utiliser la procédure stockée dans la base de données. La procédure stockée n'est pas portable.


6 commentaires

Comment profitez-vous de la mise en cache de base de données d'interrogation. Si vous avez votre code SQL dans votre logique professionnelle, il ne réutilisera jamais le chemin qui a été utilisé juste avant que chacun est une nouvelle requête, car les détails sont différents.


Mon expérience est que les niveaux moyens viennent et allons aller, mais les données vivent pour toujours. Les "procédures stockées ne sont pas portables" l'argument est spécieuse, car il est rare que des données sérieuses soient déplacées d'une base de données à une autre. Désolé, -1 de moi pour celui-ci.


L'argument sur l'utilisation de procédures stockées ne dépend pas de la portabilité. Je pense que cela devrait être basé sur des choses comme l'efficacité (mieux pour une base de données pour cruncher de nombreuses données que de faire une requête pour le tirer sur le niveau moyen, faire les calculs et persister le résultat); Que la base de données soit partagée ou non par d'autres applications (stockée des PROC conserve la logique disponible pour tous); Interface (Procs et vues stockés sous forme d'interfaces qui masquent les détails du schéma des clients).


@ Tester Testeur: Les requêtes paramétrées sont exécutées à la même vitesse avec la même mise en cache que les procédures stockées dans toutes les bases de données de relations modernes populaires. Ce n'est pas un argument valide pour utiliser des procédures stockées


@duffymo: Les bases de données partagées se trouvent dans le logiciel hérité. Maintenant, nous maintenant les inconvénients, je ne peux penser à aucune raison de créer de nouveaux logiciels avec une base de données partagée.


De mon expérience limitée: je n'ai pas trouvé beaucoup de différence sur les performances entre les procédures pure SQL et Storage.



1
votes

Bien que je pense que la plupart des données devraient être validées à partir de l'interface utilisateur (pourquoi envoyer des mauvaises choses connues sur le réseau à la recherche de ressources?), Je crois aussi qu'il est irresponsable de ne pas mettre des contraintes sur la base de données car l'interface utilisateur est improbable. être le seul moyen que les données soient jamais dans la base de données. Les données sont également fournies à partir des importations, d'autres applications, des corrections de script rapides pour les problèmes exécutés à la fenêtre de la requête, les mises à jour de masse exécutées (pour mettre à jour tous les prix de 10% par exemple). Je veux que tous les mauvais enregistrements ont rejeté quoi que ce soit leur source et leur base de données est le seul endroit où vous pouvez être assuré que cela se produira. Pour ignorer les vérifications de l'intégrité de la base de données, car l'interface utilisateur est-elle de garantir que vous aurez finalement des problèmes d'intégrité des données, puis toutes vos données deviennent seules et inutiles.


0 commentaires