满足了第三范式后,我遇到了很大麻烦~
3NF要求一个数据库表中不包含已在其它表中已包含的非主关键字信息
比如说 我做了一个工作流引擎,它支撑的业务数据里面有用户A做过的一个审批单据,里面的名字是A的真实姓名,比如:王总。
TABLE FLOW_BUSNESS
USER_NAME 'A'
TEXT '同意'
.
.
.
正常情况 当查询这个业务单据时,可以根据FLOW_BUSNESS中的USER_NAME 'A' 去用户表里找到 'A'对应的姓名是王总。
但是假如有一天这个用户删除了,那时候业务单据不就查不到“王总”了么?因为只记录了是USER_NAME 'A'做的审批,而此时'A'和'王总'已经无从对照了!
可能是我对这个问题理解有误,但我确实遇到这个问题!请教各位一般系统中是如何解决这个问题的。
总结就是:
一个系统中如果某个用户离职了,被删除之后他曾经在这个系统中做过的业务都会受到影响。前提是需求中有“删人员注销帐户后,系统要保存这个人曾经做过的工作业务数据”。
[解决办法]
对于正在使用的用户不允许删除,或者是在用户管理加状态,加删除标记,只做逻辑删除不做物理删除
[解决办法]
删除时并不能够真正删除,只是标记一下
管理软件中这种问题很常见,某个人离职了,并不表示这个人做的事情都不存在了
只是可用状态为“可用”,或在职状态为“离职”
[解决办法]
现在的系统,一般都不删除,只是标记一下就可以了
还有,虽然第三泛式是最好的,但有时候可以适当地降低泛式,增加一点冗余,但处理起来就方便的多了,也可以避免你这样的问题,一删除了就没法跑下去了。不过这个是要考虑平衡后来取的。