Application de l'intégrité de la base de données

19

Est-ce que cela aurait du sens que l'application applique l'intégrité de la base de données au lieu d'avoir des clés étrangères, des contraintes de vérification, etc.?

Quelle amélioration des performances peut-on attendre de ne pas appliquer l'intégrité de la base de données via des outils de base de données internes?

Renats Stozkovs
la source

Réponses:

24

À vrai dire, non seulement vous ne verrez pas beaucoup de pertes de performances dues à des contraintes de clé étrangère dans la base de données, mais vous verrez également des améliorations de performances. L'optimiseur de requêtes SQL Server est construit autour du concept de clés primaires et foriegn ainsi que d'autres types de contraintes de données. Si ceux-ci sont en place et appliqués, l'optimiseur peut en tirer parti pour vous offrir de meilleures performances. Voici un article de blog avec un exemple simple qui le montre en action.

Si vous êtes dans un cas limite où vous avez vraiment plus d'insertions que de lectures (et que les mises à jour et les suppressions nécessitent des lectures, elles finissent généralement par s'ajouter au nombre de lectures), alors il peut être judicieux de supprimer les contraintes des données pour les performances, peut-être . Mais comme l'écrasante majorité des bases de données sont orientées en lecture, vous sacrifiez les performances, pas les améliorez.

Et rien de tout cela ne mentionne le fait que l'intégrité des données est mieux gérée dans la base de données car vous ne devez la créer qu'une seule fois, comme si vous effectuez tout le travail dans le code, vous devrez peut-être le faire plusieurs fois pour plusieurs applications (sauf si vous concevez soigneusement votre couche d'accès aux données et exigez que chaque application accède à la base de données pour passer par cette même couche).

Si vous utilisez un système de base de données relationnelles, je dis, pourquoi ne pas vraiment l'utiliser. Si vous n'avez pas besoin de données relationnelles, optez pour Hadoop ou autre chose.

Grant Fritchey
la source
2
C'est à peu près dans la ligne de ce que je pensais et attendais. Je savais que DBA lors de mon travail précédent avait tort à ce sujet, je voulais juste avoir une opinion indépendante à ce sujet. Merci!
Renats Stozkovs
17

Beaucoup de développeurs d'applications le pensent.

Lorsque vous êtes tenté de déléguer l'intégrité des données au code d'application, pensez "Chaque programmeur et chaque application qui frappe cette base de données jusqu'à la fin des temps doit parfaitement bien le faire, à chaque fois."

Quelles sont les chances?

Mike Sherrill 'Cat Recall'
la source
5
+1. C'est tout. Vous remplacez un système central et bien testé par une multitude de programmeurs auxquels vous devez adhérer. À chaque fois. Ne se produira pas-donc vous obtenez des bases de données avec de mauvaises données au fil du temps.
TomTom
13

Même s'il y a un gain de performances, il est négligeable par rapport au retour de l'intégrité référentielle et de l'intégrité des données généralisées.

Il est loin le temps où une base de données est un magasin de données stupide. Tirez parti de la puissance offerte par le SGBDR.

Les gains de performances ne sont pas tout, surtout à une échelle aussi petite que celle-ci. Mais lorsque vous découvrez que vous avez une relation de clé étrangère supposée que votre application est censée appliquer, et qu'il s'avère que ce n'est pas une clé primaire dans le tableau de référence, vous vous souciez très peu du gain de performances (le cas échéant, je peux 't parler sur les détails de cela).

Thomas Stringer
la source
-1. Il est loin le temps où les gens mettent la logique d'application dans la base de données, la plus difficile et la plus coûteuse à mettre à l'échelle une partie de la pile entière - pour moi, les bases de données sont un magasin de vidage avec une logique gérée par des applications. C'EST DIT: L'intégrité référentielle concerne l'intégrité au niveau de la base de données et est très utile.
TomTom
5
@TomTom La réécriture de la logique d'intégrité des données dans votre application est en train de refaire le travail déjà effectué dans les SGBDR. Conservez la logique des données dans la base de données.
Thomas Stringer
@TomTom - "Les données théoriques invalides ne devraient jamais toucher la base de données, mais l'intégrité est une dernière ligne de défense." D'accord. Cette forme AJAX sophistiquée permettra à vos utilisateurs finaux de gagner beaucoup de maux de tête en validant leur entrée dès le départ. De même, ces contraintes de base de données permettront à votre entreprise et à vos ingénieurs d'économiser autant de temps, d'argent et d'énergie perdus à nettoyer après un mauvais code .
Nick Chammas
6

Il est courant de supprimer les contraintes (clés étrangères, CHECK, etc.) et les index si vous effectuez un chargement de données suffisamment important, puis de réactiver / implémenter les contraintes et les index par la suite. Cette validation a un coût en temps. Cela suppose que vous ne pouvez pas utiliser la syntaxe de chargement en masse spécifique à la base de données (y compris la minimisation de la journalisation).

Il est impossible de dire à quel point une augmentation des performances est attendue - chaque situation est unique (types de données, conception, etc.). La seule façon de vraiment savoir est de tester.

Poneys OMG
la source
1
+1. Notez que c'est un cas spécial, cependant - en général, les fichiers de données ne font aucun traitement et supposent que les données sont correctes et souffleront de toute façon à l'étape de recréation d'index. C'est une technique au niveau des entrepôts de données.
TomTom
3

Il y a quelques fois où des contraintes gênent:

  1. Quand vous devez utiliser héritage de table unique (STI). Imaginez que vous vendiez à des particuliers et à des organisations. Vous aurez besoin d'une seule table "Party" dont la ligne est soit un individu soit une organisation. STI signifie que vous avez besoin de champs nullables qui ne devraient pas l'être. L'héritage de table de classe résout ce problème, mais cela est plus difficile pour certains ORM. Par exemple, Ruby ActiveRecord ne prend en charge que STI.

  2. Lorsque vous devez prendre en charge les versions provisoires d'une entité, cela peut ne pas être complètement valide. Vous pouvez stocker un brouillon sous json, mais il est alors plus difficile de réutiliser le même identifiant sur le client - imaginez qu'il a été enregistré avec id = 5, modifié pour ne pas être valide et enregistré automatiquement en tant que draftid = 99. Dans ce cas, tous vos champs devraient probablement être annulables.

Neil McGuigan
la source