2010-08-17 2 views
0

J'ai 2 tables avec plusieurs à plusieurs:beaucoup à table n - 1 champ séparé clé primaire ou 2 existait fileds clé primaire (exemple à l'intérieur)

student 
(
id int(11) NOT NULL, 
name varchar(255), 
primary key(id) 
); 

teacher 
(
id int(11) NOT NULL, 
name varchar(255), 
primary key(id) 
); 

et je dois faire 3 Table - student_has_teacher

  1. ajouter l'option id clé primaire

    séparée student_has_teacher ( id int (11) NOT NULL, enseignant_id int (11), student_id int (11) clé primaire (id) );

  2. option de faire 2 champs de clé primaire

    student_has_teacher ( teacher_id int (11), student_id int (11), clé primaire (teacher_id, student_id), références clés étrangères (de teacher_id) enseignant (id), clé étrangère (student_id) références étudiant (id) );

Quelle est la meilleure option et pourquoi?

Merci

+0

id est le nom le plus mauvais pour un champ id. S'il vous plaît apprendre à utiliser studentid, teacherid, etc. Cela fait une énorme différence lorsque vous arrivez à des requêtes complexes et des rapports. – HLGEM

+0

Duplicate de http://stackoverflow.com/questions/963809/should-i-use-composite-primary-keys-or-not, http://stackoverflow.com/questions/159087/composite-primary-keys-versus -unique-objet-id-champ, http://stackoverflow.com/questions/1383062/composite-primary-key-to-use-or-or-not-touse? –

Répondre

1

Les deux options ne sont pas équivalentes. Dans l'option 1, il peut y avoir plusieurs appariements de chaque enseignant et étudiant. Dans l'option 2, une seule rangée est permise pour chaque combinaison d'enseignant et d'étudiant.

Il existe également une autre différence. Dans 1 l'étudiant et l'enseignant sont nullables. Dans 2 ils ne sont pas. Sur l'information donnée, je ne vois pas pourquoi un enseignant devrait être jumelé avec le même étudiant plus d'une fois. Donc, je dirais que 2 était plus approprié, mais tout dépend des besoins de l'entreprise et vous n'avez pas vraiment donné beaucoup d'informations à dire de toute façon.

1

Cela dépend. Si vous avez besoin de relier quelque chose à une rangée dans student_has_teacher (nom de tableau bizarre imo, je suggérerais student_teacher) un champ id serait bien. Si ce n'est pas le cas, les deux domaines le feront bien.

3

marque 2 champs de clé primaire

Parce qu'ils répondent à la définition de ce qu'est une clé primaire est. Ils permettent d'indiquer sans ambiguïté la rangée.