Question

Nous concevons une base de données dans laquelle je dois prendre en compte des FK (clés étrangères). contraintes. Mais cela ne se limite pas à structuration et normalisation formelles. Nous y allons seulement si cela fournit avantages en termes de performances ou d'évolutivité.

J'ai lu des articles intéressants et cherché sur Google pour des avantages pratiques. Voici quelques liens:

http://www.mssqltips.com/tip.asp?tip=1296

Je voulais en savoir plus sur les avantages de FK (en dehors de la structuration formelle et du fameux delete \ update en cascade).

  • Les FK ne sont pas "indexés" par défaut, alors quelles sont les considérations à prendre en compte lors de l'indexation d'un FK?

  • Comment gérer les champs nullables mappés en tant que clé étrangère - est-ce autorisé?

  • Mis à part l'indexation, est-ce que cela vous aide à optimiser les plans d'exécution de requêtes dans SQL-Server?

Je sais qu'il y a plus, mais je préférerais que des experts parlent de cela. Merci de me guider.

Était-ce utile?

La solution

  • Les clés étrangères ne fournissent aucun avantage en termes de performances ou d'évolutivité.
  • Les clés étrangères appliquent l'intégrité référentielle. Cela peut offrir un avantage pratique en générant une erreur si quelqu'un essayait de supprimer des lignes de la table parent par erreur.
  • Les clés étrangères ne sont pas indexées par défaut. Vous devez indexer vos colonnes de clés étrangères, car cela évite une analyse de la table enfant lorsque vous supprimez / mettez à jour votre ligne parent.
  • Vous pouvez rendre une colonne de clé étrangère nullable et insérer celle-ci.

Autres conseils

Le principal avantage est que votre base de données ne finira pas par devenir incohérente si votre code client buggy tente de faire quelque chose de mal. Les clés étrangères sont un type de "contrainte", c'est pourquoi vous devriez les utiliser.

Ils n’ont pas d’option "fonctionnelle". avantage, ils n'optimiseront rien. Vous devez toujours créer vous-même des index, etc. Et oui, vous pouvez avoir des valeurs NULL dans une colonne qui est une clé étrangère.

Les contraintes FK préservent la cohérence de vos données. C'est tout. C'est le principal avantage. Les contraintes FK ne vous apporteront aucun gain de performances.

Mais, sauf si vous avez dénormalisé la structure de la base de données à dessein, je vous recommanderais d'utiliser des contraintes FK. La raison principale - la cohérence.

J'ai lu au moins un exemple sur le réseau où il a été démontré que les clés étrangères améliorent les performances car l'optimiseur n'a pas à effectuer de vérifications supplémentaires dans les tables car il sait que les données répondent à certains critères au FK. Désolé, je n'ai pas de lien, mais le blog a fourni une sortie détaillée des plans de la requête pour le prouver.

Comme mentionné, elles concernent l'intégrité des données. Toute performance " perte " serait totalement anéanti par le temps nécessaire pour réparer les données cassées.

Cependant, il pourrait y avoir un avantage indirect en termes de performances.

Pour SQL Server au moins, les colonnes du FK doivent avoir le même type de données de chaque côté. Sans FK, vous pourriez avoir un parent nvarchar et un enfant varchar par exemple. Lorsque vous joignez les 2 tables, vous obtenez un type de conversion qui peut nuire aux performances.

Exemple: différentes longueurs de varchar causant une problème

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top