web-dev-qa-db-fra.com

Pourquoi une relation clé primaire-étrangère est-elle requise lorsque nous pouvons nous joindre sans elle?

Si nous pouvons obtenir des données de deux tables sans avoir de relation de clé primaire et étrangère, alors pourquoi avons-nous besoin de cette règle? Pouvez-vous m'expliquer clairement, avec un exemple approprié? C'est une base de données de test, ne vous occupez pas de la mauvaise structure. 

Structure des tables:

**

table - 'test1'
columns - id,lname,fname,dob
no primary and foreign key and also not unique(without any constraints)

**

**table - 'test2'
columns- id,native_city
again, no relations and no constraints** 

Je peux toujours joindre ces tables avec les mêmes colonnes 'id', Donc, s'il n'y a pas de clé étrangère principale, alors à quoi sert-elle?

38
kawade

La principale raison pour les clés primaires et étrangères est d’appliquer la cohérence des données.

Une clé primaire applique la cohérence de l'unicité des valeurs sur une ou plusieurs colonnes. Si une colonne ID a une clé primaire, il est impossible d'avoir deux lignes avec la même valeur ID. Sans cette clé primaire, de nombreuses lignes pourraient avoir la même valeur d'ID et vous ne seriez pas en mesure de les distinguer en fonction de la valeur d'ID uniquement.

Une clé étrangère impose la cohérence des données qui pointent ailleurs. Cela garantit que les données pointées existent réellement. Dans une relation typique parent-enfant, une clé étrangère garantit que chaque enfant pointe toujours vers un parent et que ce parent existe réellement. Sans la clé étrangère, vous pourriez avoir des enfants "orphelins" pointant vers un parent qui n'existe pas.

54
Daniel Renshaw

Vous avez besoin de deux colonnes du même type, une sur chaque table, pour vous associer. Qu'elles soient clés primaires ou étrangères ou non importe peu.

20
duffymo

Vous n'avez pas besoin d'un FK, vous pouvez joindre des colonnes arbitraires.

Mais avoir une clé étrangère garantit que la jointure réussira réellement à trouver quelque chose.

La clé étrangère vous donne certaines garanties qui seraient extrêmement difficiles et susceptibles d’être mises en œuvre dans le cas contraire. 

Par exemple, si vous ne possédez pas de clé étrangère, vous pouvez insérer un enregistrement détaillé dans le système et, juste après avoir vérifié que l'enregistrement principal correspondant est présent, quelqu'un d'autre le supprime. Par conséquent, pour éviter cela, vous devez verrouiller la table principale lorsque vous modifiez la table détaillée (et inversement). Si vous n'avez pas besoin de cette garantie, vous devez visser les FK.

En fonction de votre SGBDR, une clé étrangère peut également améliorer les performances de select (mais dégrade également les performances des mises à jour, des insertions et des suppressions).

17
Jens Schauder

Je sais qu'il est tard pour poster, mais j'utilise le site pour ma propre référence et je voulais donc mettre une réponse ici pour moi-même, à l'avenir aussi. J'espère que vous (et d'autres) trouvez cela utile.

Imaginons qu'un groupe d'experts de super Einstein a conçu notre base de données. Notre base de données super parfaite a 3 tables et les relations suivantes définies entre elles:

TblA 1:M TblB
TblB 1:M TblC

Notice there is no relationship between TblA and TblC

Dans la plupart des scénarios, il est facile de naviguer dans une base de données aussi simple, mais dans les bases de données commerciales, il est généralement impossible de pouvoir dire au stade de la conception toutes les utilisations possibles et la combinaison des utilisations pour les données, les tables et même les bases de données entières, d'autant plus que les systèmes construit sur et d’autres systèmes sont intégrés ou commutés. Ce simple fait a engendré tout un secteur reposant sur des bases de données appelées Business Intelligence. Mais je m'égare ...

Dans le cas ci-dessus, la structure est si simple à comprendre qu’il est facile de voir que vous pouvez vous joindre depuis TblA, jusqu’à B, puis C et inversement pour obtenir ce dont vous avez besoin. Cela met également très vaguement en évidence certains des problèmes que cela pose. Maintenant, élargissez cette chaîne simple à 10, 20 ou 50 relations. Tout à coup, vous commencez à envisager le besoin de votre scénario. En termes simples, une jointure de A à C ou inversement ou de A à F ou de B à Z ou peu importe la croissance de notre système.

Cela peut effectivement être fait de nombreuses façons. Celui mentionné ci-dessus étant le plus populaire, c’est la conduite à travers tous les liens. Le problème majeur est que c'est très lent. Et, de plus en plus de tables sont ajoutées à la chaîne, plus elles grandissent et plus vous voulez les parcourir.

Solution 1: recherchez un lien commun. Il doit être là si vous avez expliqué une raison de rejoindre A à C. Si ce n'est pas évident, créez une relation et rejoignez-la ensuite. C'est-à-dire que pour rejoindre les sociétés A à B via C, il doit exister une certaine similitude, sans quoi votre jointure ne produira aucun résultat, ni un nombre énorme, ni des résultats (produit cartésien). Si vous connaissez ce point commun, ajoutez simplement les colonnes nécessaires à A et C et liez-les directement.

La règle pour les relations est qu'elles doivent simplement avoir une raison d'exister. Rien de plus. Si vous pouvez trouver une bonne raison de créer un lien entre A et C, faites-le. Mais vous devez vous assurer que votre raison n’est pas redondante (c’est-à-dire qu’elle est déjà traitée d’une autre manière).

Maintenant, un mot d'avertissement. Il y a des pièges. Mais je ne fais pas un bon travail d’explication, je vous renvoie donc à ma source au lieu d’en parler ici. Mais rappelez-vous que cela entre dans des choses lourdes, alors cette vidéo sur les pièges de ventilateurs et de gouffres n’est en réalité qu’un point de départ. Vous pouvez rejoindre sans relations. Mais je conseille de regarder cette vidéo d’abord, car elle va au-delà de ce que la plupart des gens apprennent au collège et sur le territoire des types BI et SAP. Ces gars-là, même s'ils peuvent programmer, leur travail quotidien consiste à se spécialiser dans ce genre de choses. Comment obtenir des quantités massives de données pour se parler et avoir un sens.

Cette vidéo est l'une des meilleures vidéos que j'ai rencontrées sur le sujet. Et cela vaut la peine de regarder certaines de ses autres vidéos. J'ai appris beaucoup de lui.

6
Francis Rodgers

Une clé primaire n'est pas requise. Une clé étrangère n'est pas nécessaire non plus. Vous pouvez créer une requête joignant deux tables sur la colonne de votre choix à condition que les types de données correspondent ou soient convertis en correspondance. Aucune relation ne doit exister explicitement.

Pour ce faire, vous utilisez une jointure externe:

select tablea.code, tablea.name, tableb.location from tablea left outer join 
tableb on tablea.code = tableb.code

rejoindre avec out relation

rejoindre SQL

1
Adiii