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)
解决方案是引入第三个表,作为两个域表之间的联结.此表将保存对其他表的主键的外键引用(以及特定于该关系的任何数据,例如注册日期等).
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)
如果要了解有关此内容的更多信息,请在关系数据库的上下文中搜索数据库规范化和常规表单
这是一个小型演示.
| 归档时间: |
|
| 查看次数: |
2661 次 |
| 最近记录: |