mysql - 构建多对多关系的连接表

标签 mysql database-design

我正在开发一个应用程序,遇到了一些问题,我认为这些问题是由于我设置架构的方式造成的。

该应用程序的概述是一个大学类(class)系统。每门类(class)由多个模块组成,每个模块由多个单元组成,每个单元由练习组成。

一个要求是练习、单元和工具可以以不同的方式重复使用以形成新的内容。因此,例如练习 A 可以存在于模块 B 和模块 C 中。

最初,我选择了一个如下所示的数据库,为了简洁起见,我删除了除主键和外来 ID 之外的所有内容。

+---------+
| courses |
+---------+
| id      |
+---------+

+----------------+
| course_modules |
+----------------+
| id             |
| course_id      |
| module_id      |
+----------------+

+---------+
| modules |
+---------+
| id      |
+---------+

+--------------+
| module_units |
+--------------+
| id           |
| module_id    |
| unit_id      |
+--------------+

+-------+
| units |
+-------+
| id    |
+-------+

+----------------+
| unit_exercises |
+----------------+
| id             |
| unit_id        |
| exercise_id    |
+----------------+

+-----------+
| exercises |
+-----------+
| id        |
+-----------+

到目前为止,我似乎已经搞砸了。

给定一个特定的unit_exercise我无法知道它属于哪个类(class),因为我无法可靠地向上移动“链”,因为不可能知道哪个 module_unit这是指。

我的问题是我的连接表实际上也应该链接到它们的父表吗?例如,我将连接更改为

+----------------+
| course_modules |
+----------------+
| id             |
| course_id      |
| module_id      |
+----------------+

+-------------------+
|   module_units    |
+-------------------+
| id                |
| course_modules_id |
| module_id         |
| unit_id           |
+-------------------+

+----------------+
| unit_exercises |
+----------------+
| id             |
| module_unit_id |
| unit_id        |
| exercise_id    |
+----------------+

最初,包含此信息似乎是多余的,但我越看越觉得它是必需的。

最佳答案

我认为你可以通过两种方式做到这一点。 第一个就是你提到的。第二个,您可以像最初一样拥有所有引用表类(class)、单元、模块、练习,然后拥有包含 Course_id、Module_id、Unit_id 和Exercise_id 的最终 Course_details 表。这样您就可以添加单独的单元或练习,而无需将它们附加到类(class)或模块等中。

关于mysql - 构建多对多关系的连接表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26737949/

相关文章:

php - 上传到 mysql 时来自 excel 的日期发生变化

php - 从 mysql 输出 blob

sql - 在表中包含一个外键列?

database - 如何为未知数量的 'meta' 数据设计数据库

mysql - 如何为基于邮政编码的服务设计 MySQL 数据库?

mysql - 多对多关系的单个 SQL 查询

php - 如何防止将重复条目添加到数据库表中?

MySQL复杂算术

javascript - Node.js Web 应用程序中 MySQL 查询的延迟加载

php - 跟踪成员(member)完成的挑战/目标的最佳方式?