mysql - 表结构 - 将一个学生与多个类(class) ID 联系起来

标签 mysql database-design normalization

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

当前方法:

------------        ----------      ------------    -------------
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

建议的方法:

------------        ----------
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

最佳答案

解决方案是引入第三个表作为两个域表之间的连接点。该表将包含对其他表的主键的外键引用(加上特定于该关系的任何数据,例如注册日期等)。

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

在最后一个表中,您将使用复合或复合主键来确保唯一性。 (不同之处在于复合 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

如果您想了解更多相关信息,请在关系数据库 的上下文中搜索数据库规范化范式

这是一个 small demo .

关于mysql - 表结构 - 将一个学生与多个类(class) ID 联系起来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32660125/

相关文章:

php - MYSQL/PHP - 将用户附加到项目的有效方法

mysql - 我应该聚合吗?这是一个明智的做法吗?

MYSQL:用户标识的计数类型

mysql - 从表中获取特定用户的所有行以及总和

php - 使用数组值选择查询

firebase - 查询 Firebase 年/月/日嵌套中的特定 ID

php - 将我的标准化表关联在一起

python-3.x - yolov5 中的非标准化标签

mysql - 树状分类系统的数据库设计

php - mysql数据库auto_id在数据库中排列错误