如何创建一个使用整个其他外表的表?

时间:2012-01-31 20:42:42

标签: mysql sql

假设我有这个:

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等)?

谢谢!

2 个答案:

答案 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 ......没有冲突。