【发布时间】:2018-07-06 10:50:36
【问题描述】:
假设我有两张表学生和科目之间的多对多关系。所以我们创建一个中间表来映射数据。可以说它是students_subjects。 student_subjects 表有 2 列,即 student_id 和 subject_id。
+------------+--------------+
| student_id | student_name |
+------------+--------------+
| | |
+------------+--------------+
+------------+--------------+
| subject_id | subject_name |
+------------+--------------+
| | |
+------------+--------------+
+------------+------------+
| student_id | subject_id |
+------------+------------+
| | |
+------------+------------+
直到最近,students_subjects(学生选择科目)有更新,我所做的只是删除了学生插入新科目的所有科目。
+------------+------------+----------+
| student_id | subject_id | selected |
+------------+------------+----------+
| 1 | 2 | 1 |
+------------+------------+----------+
| 1 | 2 | 0 |
+------------+------------+----------+
但最近我在这个中间表中添加了一个新列作为选择。因此,如果学生选择了新科目并取消选择了一些旧科目,我会为新科目添加 active 并为取消选择的科目添加 non_active。 (我在 PHP 中通过获取新选择的科目和以前的科目来做到这一点。然后比较两者。当学生选择科目时,我检查学生拥有的所有科目[活跃和非活跃]。如果新选择的科目以前没有活跃我激活它们并添加新的主题。)
这样做的最佳做法是什么。我有更好的方法来实现这一点吗?
【问题讨论】:
-
这不是答案。一种推荐。您可以使用 ORM 更轻松地找出这种类型的关系。
-
我不是 DBA,但可能有两个“生效日期”列?一个带有“有效开始”,一个带有“有效结束”(在创建行时可能会填充也可能不会填充)。那么,如果课程在开始之后和结束之前,那么它是“活跃的”?
-
使用新的“selected”列,您是否在表中查询为“1”的学生id和fine id并将这些科目添加到学生和科目表中?然后将student_subjects表中的“1”标志设置为“0”?
-
当学生选择科目时,我会检查学生拥有的所有科目(活跃和非活跃)。如果新选择的主题之前没有活跃的主题,我会激活它们并添加新的主题。
-
您是否要跟踪学生过去是否注册过某个科目?
标签: php mysql database time-complexity