MySQL设计一对多?

Posted

技术标签:

【中文标题】MySQL设计一对多?【英文标题】:MySQL design one-to-many? 【发布时间】:2012-04-14 08:16:50 【问题描述】:

我有一个处理学生的数据库。所以我有表学生和班级。现在每个学生都可以随心所欲地去上课;我将如何在 mysql 数据库模式中对此进行建模?

学生桌:

student_id
student_name
student_age
...

类表:

class_id
class_name
class_profesor
...

基本上,我不知道如何设计一个表格,让一个学生可以为他/她自己注册任意数量的课程?

我应该为此另做一张桌子吗? 这是一对多的关系吗?

【问题讨论】:

【参考方案1】:

你需要一个多对多或映射表,例如:

class_student
-------------
class_id
student_id

此表的主键应为:(class_id, student_id)。 在以下位置创建索引:(class_id, student_id),和(student_id, class_id). 查看this other SO question and answers 了解更多详情。


设置完成后,您可以使用以下命令查询给定班级的登记者:

SELECT c.class_name, s.student_name, ...
FROM   class_student cs
       LEFT JOIN class c   ON c.class_id = cs.class_id
       LEFT JOIN student s ON s.student_id = cs.student_id
WHERE  cs.class_id = '<some_class_id_here>'

【讨论】:

【参考方案2】:

您可以再维护一张表“Goes_to”,该表将仅存储 student_id 和 class_id。这将规范您的数据,并且您可以根据您的要求编写不同类型的查询。

【讨论】:

【参考方案3】:

同意伯尼的观点,这是多对多的关系。除了 Bernie 解释的内容之外,您还可以在“class_student”表中添加额外的字段,例如学生在该课程中的平均成绩,或者他没有上过该课程的次数。

【讨论】:

以上是关于MySQL设计一对多?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL数据库07 /MySQL 表的一对一对多多对多问题

django mysql 表的一对一 一对多 多对多

减少 MySQL 中具有许多一对多关系 (ORM) 的查询

一对一、一对多、多对多,如何设计数据表?

数据库中根据数据一对一,一对多,多对多关系设计

MySQL基础:多表查询