MS SQL création de plusieurs-à-plusieurs relation avec une table de jonction

J'utilise Microsoft SQL Server Management Studio et lors de la création d'une table de jonction, devrais-je créer une colonne ID pour la table de jonction, si c'est le cas, devrais-je également en faire la colonne clé primaire et identité? Ou gardez juste 2 colonnes pour les tables que je joins dans la relation de plusieurs à plusieurs?

Par exemple si ce serait la de nombreuses de nombreuses tables:

MOVIE
Movie_ID
Name
etc...

CATEGORY
Category_ID
Name
etc...

dois-je faire la jonction de la table:

MOVIE_CATEGORY_JUNCTION
Movie_ID
Category_ID
Movie_Category_Junction_ID

[et de faire de l' Movie_Category_Junction_ID ma clé principale et mon utilisation comme la Colonne d'Identité] ?

Ou:

MOVIE_CATEGORY_JUNCTION
Movie_ID
Category_ID

[et juste en rester là avec pas de clé primaire ou de l'identité de la table] ?

22
demandé sur Taryn 2013-02-03 23:28:06

3 réponses

je voudrais utiliser la deuxième table de jonction:

MOVIE_CATEGORY_JUNCTION
Movie_ID
Category_ID

La clé primaire serait la combinaison des deux colonnes. Vous auriez aussi une clé étrangère de chaque colonne vers le Movie et Category tableau.

la table de jonction ressemblerait à ceci:

create table movie_category_junction
(
  movie_id int,
  category_id int,
  CONSTRAINT movie_cat_pk PRIMARY KEY (movie_id, category_id),
  CONSTRAINT FK_movie 
      FOREIGN KEY (movie_id) REFERENCES movie (movie_id),
  CONSTRAINT FK_category 
      FOREIGN KEY (category_id) REFERENCES category (category_id)
);

Voir SQL jouer avec la Démo.

en utilisant ces deux champs comme PRIMARY KEY empêchera les doublons de combinaisons film/catégorie d'être ajoutés à la table.

44
répondu Taryn 2013-02-03 19:55:54

il y a différentes écoles de pensée à ce sujet. Une école préfère inclure une clé primaire et nommer la table de liaison quelque chose de plus significatif que les deux tables qu'elle lie. Le raisonnement est que, bien que le tableau puisse apparaître comme un simple tableau de liaison, il peut devenir son propre tableau avec des données significatives.

un exemple est un nombre à plusieurs entre les magazines et les abonnés. Vraiment ce lien est un abonnement avec ses propres attributs, comme l'expiration date, état du paiement,etc.

Cependant, je pense que, parfois, une table de liaison est juste une table de liaison. La relation de plusieurs à plusieurs avec les catégories en est un bon exemple.

donc dans ce cas, une clé primaire séparée d'un champ n'est pas nécessaire. Vous pourriez avoir une clé Auto-assignée, ce qui ne nuirait à rien, et rendrait la suppression d'enregistrements spécifiques plus facile. Il pourrait être bon comme une pratique générale, donc si la table se développe plus tard dans un tableau significatif avec son propre données importantes (sous forme d'abonnements) elle disposera déjà d'une clé primaire auto-assignée.

Vous pouvez mettre un index unique sur les deux champs pour éviter les doublons. Cela empêchera même les doublons si vous avez une clé auto-assignée séparée. Vous pouvez utiliser les deux champs que votre clé primaire (qui est aussi un index unique).

ainsi, la seule école de pensée peut coller avec integer auto-assignent les clés primaires, et évite les clés primaires composées. Ce n'est pas la seule façon de le faire, et peut-être pas le meilleur, mais ça ne te mènera pas mal, dans un problème où tu le regretteras vraiment.

Mais, pour quelque chose comme ce que vous faites, vous serez probablement très bien avec juste les deux champs. Je recommande toujours soit de faire des deux champs une clé primaire composée, soit au moins de mettre un index unique sur les deux champs.

16
répondu Marlin Pierce 2014-11-08 14:06:08

je choisirais la 2e table de jonction. Mais faites de ces deux champs la clé principale. Pour restreindre les entrées en double.

1
répondu higgs_boson 2014-10-23 14:46:10