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

时间:2015-09-18 20:00:55

标签: mysql database-design normalization

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

目前的做法:

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

3 个答案:

答案 0 :(得分: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

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

答案 1 :(得分:0)

创建具有“学生”所有属性的“学生”表 创建具有“类”的所有属性的“class”TABLE 使用以下属性创建class_student TABLE:

id,class_id,student_id

并插入此表。

答案 2 :(得分:0)

jpw'解决方案是正确的。你必须接受一些改变。

如果您阅读带有班级表的学生表,您(当然)会得到一些行。因此,如果您的部分代码需要一个学生的一个行,您可以使用

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

我希望这能说明如何继续下去。