我正在尝试为主题前提条件创建数据库,这是我的当前表格。
“学生”
-----------------------
|studentID | FullName |
-----------------------
|1234 | John |
|1235 | Michael |
|1236 | Bryce |
“ subject_bsit”
-----------------------------------------
|subject_id| subject_name | pre_id |
-----------------------------------------
| 1 | Programming 1 | NULL |
| 2 | Networking | NULL |
| 3 | Algorithm | NULL |
| 4 | Physical Educ | NULL |
| 5 | Programming 2 | 1 |
这是连接表的结点表 现在两个。
“学生主题”
------------------------------------------------
| student_id | subject_id | Grade | Enrolled |
------------------------------------------------
| 1235 | 1 | 0 | 0 |
| 1235 | 2 | 0 | 0 |
| 1235 | 3 | 0 | 0 |
| 1234 | 1 | 0 | 0 |
例如,如果 studentID 1235 仍未采用正在编程1的 subject_id 1 ,则用户无法添加正在编程的 subject_id 5 2,因为它是编程1的前提。
我不知道我的桌子是否正确。如果是正确的,我该如何设计该数据库,我不知道该如何连接学科和学生证的先决条件。
答案 0 :(得分:0)
首先,您需要使用以下代码(MySQL 8+)递归查找指定主题的所有先决条件(父母):
-O3
(Demo1)
然后通过检查学生是否具有从上一个查询中获得的所有主题,您可以决定是否允许用户将主题分配给该学生。
如果以下查询不存在,则可以将主题添加到学生。您可以通过set @newSubjectToAdd = 5;
with recursive cte (subject_id,subject_name,pre_id) as
(
Select subject_id,subject_name,pre_id
from subject_bsit
where subject_id = @newSubjectToAdd
union all
Select sb.subject_id,sb.subject_name,sb.pre_id
from subject_bsit sb
inner join cte
on sb.subject_id = cte.pre_id
)
Select pre_id from cte
where pre_id is not null
order by subject_id
或tricky conditional insert来做到这一点:
if exists