多对多表 - 1个单独的字段主键或2个现有字段主键(示例内部)

时间:2010-08-17 14:11:46

标签: mysql database database-design data-structures

我有两张表有很多关系:

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) 主键(id) );

  2. 选项使2个字段成为主键

    student_has_teacher ( teacher_id int(11), student_id int(11), 主键(teacher_id,student_id), 外键(teacher_id)引用教师(id), 外键(student_id)引用学生(id) );

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

    由于

3 个答案:

答案 0 :(得分:3)

  

制作2个字段主键

因为它们符合主键的定义。它们允许明确地指示行。

答案 1 :(得分:1)

这取决于。如果您需要将某些内容与student_has_teacher(奇怪的表名imo,我建议student_teacher)中的某行相关联,那么id字段会很好。如果你不是,这两个字段就可以了。

答案 2 :(得分:1)

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

还有另一个不同之处。在1中,学生和老师可以为空。在2他们不是。

根据给出的信息,我不明白为什么老师需要不止一次与同一个学生配对。所以我想说2更合适,但这一切都取决于业务需求,而且你没有给出太多的信息来说明。