问一个数据库设计的级联关系的问题

时间:2022-12-11 18:45:55
关系如下:
部门--用户(1....n)
部门--试卷(1....n)
  试卷--结果(1...n)
  用户--结果(1...1)
...
其它关系略...
试卷属于部门,考试结果属于用户,因此,这想要实现部门的修改删除直接导致用户和试卷的修改删除,用户的修改删除直接导致考试结果的修改删除,所以我这样建立它们的关系:
   部门ID---级联更新/删除---用户表DeptID
     |                    用户表ID-------级联更新/删除----
     |                                                 | 
     |-----级联更新/删除---试卷表DeptID                  |
                          试卷表ID                      |
                              |                        |
                              |                    结果表UserID
                              |----级联更新/删除----结果表ExamID
这样的关系很明显形成了一个循环级联,那么我该如何进行该关系的设计呢?向各位大侠请教!!!

13 个解决方案

#1


个人感觉最好避免级联删除和更新,这一类触发器对于今后的开发,测试,维护,数据移植都很麻烦。
如果这些业务逻辑要放在数据库里面,可以写成存储过程,必要的时候再去调用,或者放在客户端也可以。
毕竟在实际的删除和更新前需要很多必要的检查和确认才能执行。

另外,对于  部门--试卷(1....n) 这个关系,
如果不是我理解有误的话,我觉得每一份试卷应该属于一个用户,当然试卷有个部门的属性是可以的。

删除用户前确保其关联的试卷结果先被删除就可以了,这不存在循环级联。

#2


谢谢一楼的回复,不爱熬夜就表熬了弟兄,

对于   部门--试卷(1....n)   这个关系
我没有讲清楚项目的需求,整个系统是一个在线考试系统,部门是分级管理的,每个部门都可以独立创建试卷,对本部门及其子部门人员进行考核,也就是说试卷有个属性是它属于哪个部门.

对于您说的解决办法(删除用户前确保其关联的试卷结果先被删除就可以了,这不存在循环级联),用户与考试结果的关系通过程序来实现其级联更新/删除.那么意思就是无法完全使用数据库关系来保证了,看来也只能如此了.

#3


这个级联应该没有问题啊
做末节点表应该是用户考试成绩表(用户ID,成绩ID,成绩数据)吧,如果是这样这个级联没有问题

#4


就结构,我不认为与问题。

但是就级联的删除我觉得要做适当调整,删除一般情况不要做物理删除。

#5


用户与考试结果的关系通过程序来实现其级联更新/删除.那么意思就是无法完全使用数据库关系来保证了,看来也只能如此了.
-------------------------------------
部门与试卷,用户与考试结果等这些关系可以通过主外键关联以确保其完整性。
更新和删除的实现则有不同方法:触发器,存储过程,客户端代码... 
只是个人觉得用触发器去实现对于今后的维护比较麻烦一些。

#6


如果各表我都加一个Deleted字段,1表示删除,如何级联将其关联表中的Deleted字段也置为1呢?是否要通过触发器或程序来实现?

#7


加删除标记也是个好办法,可以恢复误删除操作。
触发器或者程序都可以,但是用程序(存储过程,客户端代码)更灵活一些。个人的意见。

#8


结帖的时候说我可用分不够,郁闷了,怎么样才能够结帖阿?

以前我一直在vchelp论坛,最近才过来csdn,还不是很清楚这个上面乱七八糟的分都是怎么用的,呵呵

#9


同意三楼的说法,如果部门与用户是1..n的关系
那只要建立一个关系实体,用来保存用户id,试卷id,成绩 这三个属性就可以了啊,
如果考虑回复,最多加一个楼主所说的deleted来标识是否删除即可。
更新试卷的成绩或者删除用户而导致删除其成绩,也只要操作这个关系实体就行了啊,
因为试卷是一个独立的实体,并不是用户的属性,但某个试卷的成绩却可以作为一个用户的属性。

#10


奇怪了,怎么其它的回复看不到啊,只看到1--5楼

#11


不好意思,各位,我不知道怎么给大家给分呢,管理帖子,然后得分那儿输入分值,然后怎么保存呢?

#12


啊哈,知道了,结帖了...

#13


学习

#1


个人感觉最好避免级联删除和更新,这一类触发器对于今后的开发,测试,维护,数据移植都很麻烦。
如果这些业务逻辑要放在数据库里面,可以写成存储过程,必要的时候再去调用,或者放在客户端也可以。
毕竟在实际的删除和更新前需要很多必要的检查和确认才能执行。

另外,对于  部门--试卷(1....n) 这个关系,
如果不是我理解有误的话,我觉得每一份试卷应该属于一个用户,当然试卷有个部门的属性是可以的。

删除用户前确保其关联的试卷结果先被删除就可以了,这不存在循环级联。

#2


谢谢一楼的回复,不爱熬夜就表熬了弟兄,

对于   部门--试卷(1....n)   这个关系
我没有讲清楚项目的需求,整个系统是一个在线考试系统,部门是分级管理的,每个部门都可以独立创建试卷,对本部门及其子部门人员进行考核,也就是说试卷有个属性是它属于哪个部门.

对于您说的解决办法(删除用户前确保其关联的试卷结果先被删除就可以了,这不存在循环级联),用户与考试结果的关系通过程序来实现其级联更新/删除.那么意思就是无法完全使用数据库关系来保证了,看来也只能如此了.

#3


这个级联应该没有问题啊
做末节点表应该是用户考试成绩表(用户ID,成绩ID,成绩数据)吧,如果是这样这个级联没有问题

#4


就结构,我不认为与问题。

但是就级联的删除我觉得要做适当调整,删除一般情况不要做物理删除。

#5


用户与考试结果的关系通过程序来实现其级联更新/删除.那么意思就是无法完全使用数据库关系来保证了,看来也只能如此了.
-------------------------------------
部门与试卷,用户与考试结果等这些关系可以通过主外键关联以确保其完整性。
更新和删除的实现则有不同方法:触发器,存储过程,客户端代码... 
只是个人觉得用触发器去实现对于今后的维护比较麻烦一些。

#6


如果各表我都加一个Deleted字段,1表示删除,如何级联将其关联表中的Deleted字段也置为1呢?是否要通过触发器或程序来实现?

#7


加删除标记也是个好办法,可以恢复误删除操作。
触发器或者程序都可以,但是用程序(存储过程,客户端代码)更灵活一些。个人的意见。

#8


结帖的时候说我可用分不够,郁闷了,怎么样才能够结帖阿?

以前我一直在vchelp论坛,最近才过来csdn,还不是很清楚这个上面乱七八糟的分都是怎么用的,呵呵

#9


同意三楼的说法,如果部门与用户是1..n的关系
那只要建立一个关系实体,用来保存用户id,试卷id,成绩 这三个属性就可以了啊,
如果考虑回复,最多加一个楼主所说的deleted来标识是否删除即可。
更新试卷的成绩或者删除用户而导致删除其成绩,也只要操作这个关系实体就行了啊,
因为试卷是一个独立的实体,并不是用户的属性,但某个试卷的成绩却可以作为一个用户的属性。

#10


奇怪了,怎么其它的回复看不到啊,只看到1--5楼

#11


不好意思,各位,我不知道怎么给大家给分呢,管理帖子,然后得分那儿输入分值,然后怎么保存呢?

#12


啊哈,知道了,结帖了...

#13


学习