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,您(当然)会得到一些行。因此,如果您的部分代码需要 one 行 one 学生,您可以使用
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
我希望这说明了如何继续。
我目前遇到了我设计的 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,您(当然)会得到一些行。因此,如果您的部分代码需要 one 行 one 学生,您可以使用
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
我希望这说明了如何继续。