Table 结构 - Link 一个学生有多个 类 id

Table structure - Link one student with multiple classes id

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

当前方法:

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

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

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

在上一个 table 中,您将使用复合或复合主键来确保唯一性。 (不同之处在于复合 pk 也会包括其他列 - 例如日期或学期,这将允许学生在不同的场合使用相同的 class)。

要查询数据,您需要在键上加入 table:

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

创建 "student" TABLE 具有 "student" 具有的所有属性
创建 "class" TABLE 具有 "class" 具有的所有属性
使用以下属性创建 class_student TABLE:

id,class_id,student_id

并插入table.

jpw 的解决方案是正确的。不过,您必须忍受一些变化。

如果您用 class table 阅读学生 table,您(当然)会得到一些行。因此,如果您的部分代码需要 oneone 学生,您可以使用

select s.*, group_concat(c.name) as classes 
from student s
join enrollment e on s.student_id = e.student_id
join class c on c.class_id = e.class_id
group by s.student_id

我希望这说明了如何继续。