63 votes

Devez-vous appliquer des contraintes au niveau de la base de données et de l'application?

J'ai lu le livre "l'Entreprise Rails" par Dan Chak et ça m'a fait penser: pensez-vous que vous devriez avoir les contraintes de données à la fois le niveau de base de données et le niveau d'application? Ou vous sentez-vous de la même façon aux opinions des cadres comme Ruby on Rails - la base de données est une "bête référentiel" pour les données, et tous les chèques doivent être faits dans votre application (je ne cherche pas à RoR ici - je suis un grand fan de Rails de moi, mais je suis en désaccord avec son approche à la base de données)?

Personnellement, je pense que vous devriez avoir à la fois afin de vous assurer que votre base de données et l'application sont bien sécurisées. Ce que je veux dire, c'est que vous devriez faire usage de non-null de contraintes, donner à vos champs d'une longueur si elle est connue ( par opposition à la laissant tout à nvarchar(255) ), ont des choses telles que les Clés Étrangères, les Contraintes de Vérification et de Déclencheurs sur votre base de données, puis appliquer ceci à travers la logique métier des règles dans votre application. De l'OMI, ce qui rend votre application robuste grâce à son interface utilisateur, et aussi sécurisé contre quelqu'un qui pourrait avoir un accès direct à la base de données.

Le contre-argument que j'ai le plus souvent de voir, c'est qu'il exige que les montants à double logique, une fois que le niveau de base de données, et une fois au niveau de l'application -- disons que vous avez une contrainte de vérification pour vérifier qu'un produit SKU est entré (c'est à dire que la taille est plus grande que zéro).

Vous aurez besoin d'inclure également les méthodes de validation dans une logique d'entreprise à assurez-vous que la valeur que l'utilisateur a entré a une longueur supérieure à zéro, et aussi éventuellement un peu de Javascript côté client pour intercepter l'erreur que l'utilisateur des données de types.

Pour ma part, je ne vois pas cela comme une mauvaise chose - oui, vous avez quelques dupliquer la logique, mais le résultat final est la "base de données en tant que forteresse" état d'esprit, car si vous pensez à ce sujet de vos données est la partie la plus importante de votre application; après tout, à quoi bon votre brillante nouvelle application Web 2.0 si les données peuvent être facilement endommagé et compromis?

Quelles sont vos pensées sur cette question? Si la base de données d'être une forteresse imprenable comme Fort Knox, ou un coffre ouvert, qui est gardé par des lasers? En d'autres mots, vous devez sacrifier une partie de la duplication de la logique afin d'assurer une sécurité modèle de données, ou de tout quitter pour votre application et de l'utilisation de la base de données simplement pour stocker des données?

40voto

Learning Points 5386

En bref : base de données doit appliquer les contraintes.

Pourquoi :

  1. Plus facile. Pour ex. pour avoir une contrainte sur une colonne de données il n'y a qu'un seul endroit pour la définir : la colonne elle-même. Les données peuvent provenir de diverses sources, mais le contrôle est mis où les données sont finalement mis au repos.
  2. De l'intégrité. La base de données devrait être responsable pour les données qu'il héberge. Une base de données incohérente est aussi bon que pas de base de données.
  3. La flexibilité. Nouvelle INTERFACE utilisateur environnements de développement viennent trop souvent. Si la base de données met en place sa main pour dire qu'elle va prendre soin de les contraintes , le développement front end et les tests fonctionnels sont plus faciles.

26voto

paxdiablo Points 341644

Oui, si vous souhaitez restreindre à ce qui se passe dans la base de données. Les couches doivent être distinctes les unes des autres, autant que possible, et votre base de données ne doit pas reposer sur un autre calque de s'assurer qu'il respecte les règles.

Il n'y a pas de garantie qu'un buggy (ou malveillante) "logique d'entreprise" de la couche ne sera pas insérer toxiques de données dans vos tables. Bien sûr, si vous pouvez faire confiance aux autres couches, vous n'en aurez pas besoin. Mais je travaille dans un gros magasin où les Administrateurs de bases de données sont toujours d'avoir à réparer les problèmes causés par le jeune Java whippersnappers le déploiement de leur buggy code de production sans tenir (tout?) tests :-).

Tables de base de données qui sont partagées entre les différents domaines de développement (et c'est tout d'eux pour nous) doit toujours se protéger de l'errant de données. Lors de l'Application d'Un met douteux des données dans la table utilisée par l'Application B, ce n'est pas l'Application d'Un des développeurs qui prennent la chaleur, c'est les Administrateurs de bases de données.

25voto

Mike Thompson Points 4178

Si vous suivez le Jeff Atwood l'école de base de données est juste un idiot de stockage de données et de la récupération du système, puis vous mettriez tous la validation dans la couche application.

Cependant, je trouve que les applications sont comme de petits enfants. Décoché ils vont jeter tout autour de la salle. Il appartiendra aux parents pour nettoyer le gâchis. Dans ce cas, il sera le Dba faire le nettoyage.

Cependant, je pense que vous devez être prudent sur l'utilisation de chaque fonction d'intégrité des données de base de données, juste parce que c'est là. La surcharge de votre base de données avec des contraintes de clés étrangères et les déclencheurs pourrait créer plus de problèmes que vous ne le pensez. J'ai tendance à utiliser les clés étrangères uniquement sur les tables, qui sont très étroitement liés, comme un en-tête/table de détail paire. Si vous commencez à ajouter des clés étrangères partout où vous pouvez vous retrouver avec un unmagageable base de données.

J'ai rarement utiliser des déclencheurs. Je pense qu'ils font une base de données très opaque. Vous émettez une simple mise à jour/insérer/supprimer une commande et des choses étranges peuvent se produire. Je pense qu'il y a deux endroits où les déclencheurs sont inévitables:

  1. Lorsque vous n'avez pas le code source de l'application de l'écriture à la base de données et vous avez besoin de modifier le comportement. Les déclencheurs sont votre seule option.

  2. Si vous effectuez les opérations CRUD sur une vue. Les déclencheurs sont obligatoires pour l'insérer/mettre à jour/supprimer des opérations.

J'ai tendance à effectuer une validation de base dans l'application. De cette façon, l'utilisateur reçoit une rétroaction immédiate que quelque chose est faux. Complexe de validation qui nécessite à la recherche des tables, il est probablement préférable de faire dans la base de données (ainsi que la simple validation de l'app n'). Je dirais que certaines formes de validation sont presque impossible à garantir, au niveau de l'application, sans l'aide de complexes de verrouillage des stratégies.

Si vous avez plusieurs applications, éventuellement écrits en différentes langues sur les différentes plates-formes, puis les cas de mettre plus de la validation dans la base de données de la couche est renforcé. Le liklihood de deux ou plusieurs applications, écrites par différents programmeurs, les mêmes validation est assez éloignée. Mieux de le faire en un seul endroit.

Le Jeff Atwoods de ce monde suggèrent que vous écrivez un service web qui toutes les applications à utiliser pour communiquer avec. Le service web effectue la validation des données. Ceci permet à la base de données à rester muet conteneur de stockage, vous permettant ainsi de basculer moteurs de base de données. En réalité, il est rare de changer les moteurs de base de données (sauf si vous avez commencé avec Microsoft Access!). Si vous êtes à la rédaction web services purement de centraliser vos données de validation puis je thnk vous aller à la mer.

17voto

Brian Rasmussen Points 68853

Si vous êtes certain que vous n'aurez jamais un autre client de l'application, vous pouvez obtenir loin dans le traitement de la base de données comme un simple stockage. Toutefois, si vous avez plus d'une application client évidemment, vous aurez à reproduire les contraintes dans toutes les applications du client, ce qui est une mauvaise idée. Rappelez-vous que d'autres clients comprennent des outils de développement.

Aussi, en utilisant la base de données comme un "idiot référentiel", vous aurez très probablement jusqu'à la fin avec de moins en moins efficace de l'application. La base de données peut faire beaucoup de choses de manière beaucoup plus efficace que votre application peut. Pourquoi ne pas en profiter?

8voto

JoshBerke Points 34238

Je pense que vous devriez essayer et de protection de vos données à tous les coûts. Rien n'est pire que d'essayer de faire du reporting sur une application qui a de mauvaises données, car l'application a eu un bug. Maintenant, qu'est-ce que cela signifie?

Vous devez faire valoir vos relations par le biais de FK, il n'y a pas de raison de ne pas. Vous devriez essayer et d'éviter les valeurs null et les utiliser uniquement lorsque les valeurs null sont appropriés. Je crois qu'il y a une fine ligne cependant.

Si vous analysez un numéro de téléphone pour s'assurer qu'il est dans le bon format? Probablement pas, mais vous devriez probablement stocker le numéro de téléphone dans un schéma qui n'est pas un formatage de la question.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X