假设我有这个:
CREATE TABLE `classes`
(
`class_ID` INT AUTO_INCREMENT,
FOREIGN KEY (`student_ID`) references `students`(`student_ID`),
PRIMARY KEY (`class_ID`)
)
ENGINE = InnoDB;
这里的事情是每个班级都指一个学生。但我希望它能引用另一组学生,例如:
CREATE TABLE `students`
(
`student_ID` INT AUTO_INCREMENT,
`name` VARCHAR(20) NOT NULL,
PRIMARY KEY (`student_ID`)
)
ENGINE = InnoDB;
因此,我想要多个学生表,每个表与一个类相关联。我怎样才能做到这一点?我是否必须为每个班级申报一个表格(例如students1,students2等)?
谢谢!
答案 0 :(得分:3)
首先要解决这个问题有点难以理解。过了一会儿就变得很自然了。是一种众所周知的设计模式。你需要第三张表:
create table students_in_courses(studentid, courseid)
在此表中,每个学生和学生所在的每门课程都有一行。您可以将这句话翻过来:每门课程和本课程中的每个学生都有一行。
这是一个“链接表”。它用于M:N映射。
您可以将此表视为一个实体,就像学生和课程一样。您甚至可以添加其他列:
create table students_in_courses(studentid, courseid, date_entered, date_exited, grade)
一定数量的表就足够了。
让我尝试不同的解释:我们可以通过保存一个矩阵,学生作为行,课程作为列来存储学生在哪个课程中的信息。每个小区都有一个布尔:学生在这个课程中是/否。
现在我们将整个矩阵保存在这样的表中:
create table students_in_courses(studentid, courseid, is_in_course bit) primary key(studentid, courseid)
每一个细胞一排。现在我们用is_in_course = 0删除所有行并删除该列,因为它现在只包含1。我们回到原来的解决方案。我们的“链接表”存储两个表的交叉积矩阵的非零单元格。
答案 1 :(得分:3)
没有。您创建一个具有引用两个表的外键的表:
CREATE TABLE students_classes (
student_id int,
classes_id int,
PRIMARY KEY (student_id, classes_id),
FOREIGN KEY (student_id) REFERENCES students (student_ID),
FOREIGN KEY (classes_id) REFERENCES classes (class_ID)
);
这样你就可以在班级(#53和37和83)中学生(例子)#7,在班级(#53,#212,#7)等学生#12 ......没有冲突。