2010-06-01 16 views
26

Vaut-il mieux utiliser des clés étrangères dans des tables ou les mêmes résultats peuvent-ils être obtenus avec des jointures?Clés étrangères vs jointures

+3

Quelle est la différence? Les jointures sont définies à l'aide de clés étrangères uniquement. Bien sûr, vous ne pouvez pas définir la clé étrangère dans la base de données. L'utilisation de la clé étrangère améliore les performances (à condition que la sélection de la clé étrangère soit correcte). – Kangkan

+2

'Les jointures sont définies à l'aide de clés étrangères uniquement. Faux! 'L'utilisation de la clé étrangère améliorera les performances. Aussi faux. En fait, si quoi que ce soit, FK peut nuire à la performance, mais rarement à un degré notable qui justifie le retrait alors. – Brandon

+1

@Kangkan création FK n'a rien à voir avec la performance FK! = Indexes. Il y a un SGBD automatique qui crée un index dans la création FK mais la plupart ne le font pas. Les jointures n'ont pas besoin de FK, veuillez vous référer à l'excellente réponse de Daniel. Peut-être que OP est confus par les frameworks ORM – jean

Répondre

53

Foreign keys sont juste des contraintes pour appliquer referential integrity. Vous devrez toujours utiliser JOINs pour créer vos requêtes.

clés étrangères garantissent qu'une ligne dans une table order_details avec un champ order_id faisant référence une table orders aura jamais une valeur order_id qui n'existe pas dans le tableau orders. Les clés étrangères ne sont pas obligées d'avoir une base de données relationnelle fonctionnelle (en fait le moteur MySQL's default storage ne prend pas en charge les clés FK), mais elles sont absolument essentielles pour éviter les relations rompues et les lignes orphelines (intégrité référentielle).

+1

Je veux juste faire remarquer que, bien que FK soient cool, il est plutôt mal conçu pour * compter * sur le DB pour la logique de l'application. Votre application peut se casser sans mise à jour de votre base de données (multiplier par les installations). Mai aussi bien le minimiser. –

+6

@sims: Je ne considère pas l'intégrité référentielle comme une logique d'application. La capacité à appliquer l'intégrité référentielle au niveau de la base de données est requise pour que le C dans [ACID] ​​(http://en.wikipedia.org/wiki/ACID) soit valide. –

+0

@sims: Je suis d'accord avec Daniel, mais j'aimerais prolonger son raisonnement. IMO RI fait partie de la logique métier (ou «logique des données») il doit être appliqué quelque part (UNE FOIS, ne vous répétez pas). Puisque le DB est l'autorité de données centrale/finale, les données doivent y être valides, donc son point appelant l'ACID est correct! – lexu

22

FOREIGN KEY s et JOIN s ne font pas la même chose!

  • A FOREIGN KEY renforce l'intégrité des données, en vous assurant que les données confirme certaines règles quand il est ajouté à la DB.
  • Un JOIN est utilisé lorsque vous extrayez/interrogez des données de la base de données en donnant des règles pour sélectionner les données.

  • JOIN s travail s'il y a FK ou non.

  • Le travail de FK si vous extrayez des données avec ou sans JOIN s.

CONCLUSION: FK et JOIN ne vous permettent pas d'atteindre le même but!