表结构 - 链接一个具有多个类ID的学生

Mar*_*ing 0 mysql database-design normalization

我目前正面临着我设计的桌面问题(请参见下文).一个学生可以属于多个班级.我开始在以后的一列中存储多个值,以了解这是一个很大的不.例如,class_id在存储由逗号分隔的值时,faces会出现类型丢失和成为字符串的问题.我已阅读制作文章,它表示制作两个表一个用于课堂,另一个用于学生,但不确定如何插入基本上将学生链接到多个班级的数据.什么是最好的方法?

目前的做法:

------------        ----------      ------------    -------------
student_fname       student_id      class_name      class_id
------------        ----------      ------------    -------------
james               Vre94b3JpXO     math,science    5697,5768
jim                 JzqQ2zRVNm1     art, music      7604,7528
jenny               xgqv9P42eYL     physical-ed     6422    
kyle                QLNM0Wbyqk0     computer,jrotoc 6315,8797
kimberly            P2egAddWN0Q     culinary-arts   8069
kayla               EGNDjWAreAy     science, art    5768,7604 
noah                bPeOyMMONGr     math, music     5697,7528
nataly              9Op53GGmqk5     jrotc           8797
Run Code Online (Sandbox Code Playgroud)

建议的方法:

------------        ----------
class name          class id
------------        ----------
math                5697
science             5768
computer            6315
physical-ed         6422
music               7528
art                 7604
jrotc               8797
culinary-arts       8069

------------        ----------
student fname       student id
------------        ----------
james               Vre94b3JpXO
jim                 JzqQ2zRVNm1
jenny               xgqv9P42eYL
kyle                QLNM0Wbyqk0
kimberly            P2egAddWN0Q
kayla               EGNDjWAreAy
noah                bPeOyMMONGr
nataly              9Op53GGmqk5
Run Code Online (Sandbox Code Playgroud)

jpw*_*jpw 6

解决方案是引入第三个表,作为两个域表之间的联结.此表将保存对其他表的主键的外键引用(以及特定于该关系的任何数据,例如注册日期等).

Class table:
class name          class_id (primary key)
------------        ----------
math                5697
science             5768

Student table:
student fname       student_id (primary key)
------------        ----------
james               Vre94b3JpXO
jim                 JzqQ2zRVNm1

Enrollment table:
student_id (fk to stud.)  class_id (fk to class)
------------              ----------
Vre94b3JpXO               5697
JzqQ2zRVNm1               5697
JzqQ2zRVNm1               5768
Run Code Online (Sandbox Code Playgroud)

在最后一个表中,您将使用复合或复合主键来确保唯一性.(不同之处在于复合pk还包括其他列 - 例如日期或术语,这将允许学生在不同的场合使用相同的课程).

要查询数据,您可以加入键上的表:

select * 
from student s
join enrollment e on s.student_id = e.student_id
join class c on c.class_id = e.class_id
Run Code Online (Sandbox Code Playgroud)

如果要了解有关此内容的更多信息,请在关系数据库的上下文中搜索数据库规范化常规表单

这是一个小型演示.