À 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.
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?
la source
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).
la source
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.
la source
Il y a quelques fois où des contraintes gênent:
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.
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.
la source