2010-08-17 49 views
0

我有2代表与多对多关系:到许多许多表 - 1个单独字段主键或2存在的Fileds主键(实施例内)

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

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

和我应该做3表 - student_has_teacher

  1. 选项添加ID单独字段主键

    student_has_teacher ( id int(11)NOT NULL, teacher_id int(11), student_id int(11) primary key(id) );

  2. 选项使2场主键

    student_has_teacher ( teacher_id INT(11), student_id数据INT(11), 主键(teacher_id,student_id数据), 外键(teacher_id)引用老师(id), 外键(student_id)引用学生(id) );

什么是更好的选择,为什么?

谢谢

+0

id是id字段的最差名称。请学习使用studentid,teacherid等。当您遇到复杂的查询和报告时,它会产生巨大的差异。 – HLGEM 2010-08-17 15:20:09

+0

重复http://stackoverflow.com/questions/963809/should-i-use-composite-primary-keys-or-not,http://stackoverflow.com/questions/159087/composite-primary-keys-versus -unique-object-id-field,http://stackoverflow.com/questions/1383062/composite-primary-key-to-use-or-not-to-use? – 2010-08-17 17:01:58

回答

1

这两个选项并不等同。在选项1中,每个教师和学生可以有多个配对。在选项2中,每个教师和学生的组合只允许有一行。

还有另一个区别。 1,学生和老师可以为空。在2他们不是。

关于给出的信息,我不明白为什么老师需要多次与同一名学生配对。所以作为一个猜测,我会说2是更合适的,但这一切都取决于业务需求,并且你没有真正提供很多信息来说。

1

这取决于。如果你需要在student_has_teacher(奇怪的表名imo,我建议student_teacherid字段中的某一行关联一个字段将是很好的。如果你不是,这两个领域将会很好。

3

化妆2场主键

因为他们完成的主键是什么的定义。他们允许明确指出行。