我目前正面临着我设计的桌面问题(请参见下文)。一个学生可以属于多个班级。我开始在以后的一列中存储多个值,以了解这是一个很大的不。例如,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
答案 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
我希望这能说明如何继续下去。