多值依赖 模式分解 (学习感想)

模式分解,是关系规范化的手段,而关系规范化的实质就是概念的单一化,一事一地,(这里书上讲得挺好的),从而避免或减少增删改的异常/繁琐(以下统称异常)。
对于一个只有函数依赖的模式而言,我们把它分解到BCNF这个层次,那就彻底解决了增删改的异常,如(学生S,系Sd,宿舍D)有S→Sd,Sd→D,当我们把它分解为(学生S,系Sd)和(系Sd,宿舍D),就不用再考虑语义上的啥啥函数依赖了,增删学生或系,都不会造成异常,修改系主任名字也不用那么繁琐,当然了你要是修改系名,两个表都得改一下,毕竟你要满足参照完整性。至于如何把一个只含函数依赖的模式分解到BCNF,我在此就不多赘述了。
而对于含有非平凡非函数依赖的多值依赖的模式而言,如何分解到BCNF,如何分解到4NF呢?
我们先讲策略:在我们对一个含有函数依赖和非平凡非函数依赖的多值依赖的模式进行分解到BCNF时,不用考虑那个非平凡非函数依赖的多值依赖,直接忽略,就观察它的函数依赖,把它分解到BCNF即可。而要分解到4NF,同前面步骤一样,在BCNF的基础上,观察分解得到的各个BCNF关系,看是否仍存在非平凡非函数依赖的多值依赖,如果不存在那就是4NF,不用变了,如果有BCNF表仍存在双非多值依赖,那么按照书上定理,将双非多值依赖分解为平凡的非函数依赖的多值依赖即可,那么按照定理,它就是4NF。
回过头来说,对于一个只有函数依赖的模式而言,在分解它时,我们要考虑它的函数依赖和无损链接。无损链接是为了避免数据的丢失,而函数依赖是为了避免增删改的异常。这就是我们一般用到的模式分解的准则。
对于函数依赖而言,BCNF就已经到终极了。但对于双非多值(越写越短,下次非多)而言,这貌似才刚刚开始。但开始的晚并不意味它还能活很久,至少对于我们而言,到下一步的4NF就over了。
对于双,不对,非…,害算了,就叫双非多值叭,对于双非多值而言,其实书上,你们观察下书上的说法,存在双非多值依赖,增删改很不方便,数据冗余也很明显。然后提出利用4NF来消除双非,但4NF怎么就减少冗余了,4NF怎么就避免或减少增删改的异常了,emmm,它没有说。但,很明显的,减少存储冗余,那是显而易见的。
我举个很常见的多值依赖的例子,(课程C,老师T,参考书B)(全码,BCNF),分解为(课程C,老师T)和(课程C,参考书B)(都是4NF),这是书上的例子,很直观的,它减少了数据的存储冗余,这确实。但避免了增删改的异常了吗?就单这个例子而言,它确实也很直观的避免或减少了。如课程C1,有T1,T2两位老师,B1B2B3三本书,在原表中我要给C1加一位老师T3,那我就得添加3个元组,而在分解后的(课程C,老师T)和(课程C,参考书B)中只要加一个元组即可。
但你要说4NF对双非多值而言就像BCNF对于函数依赖而言那样,彻底解决它带来的增删改异常,这是不准确的。
对于简单的多值依赖,一个模式(X,Y,Z),只有X→→Y,你分解为4NF后确实彻底解决了增改异常(我也不知道有没有彻底解决,但我觉得挺彻底的),但你拿0129问的那道题:R(A,B,C,D),有A→→C和C→→BD。分解为(AC)和(CBD),它的增删改仍是会异常,你在CBD中若只添加一个元组,就有可能破坏A→→C这一关系,所以还是很复杂的,你在原表中在不破坏它多值依赖的基础上对它增删改,其本身就是一个很复杂的事,而在4NF中仍然很复杂,不像BCNF中的函数依赖那样彻底解决。所以4NF对于多值依赖增删改的优化是有限的,越复杂的多值依赖,增删改越复杂。
题目中,要求的是把模式分解到4NF,那就按4NF定义,按分解定理分解到4NF就可以了,就像题目要求分解到3NF一样,3NF虽然没有彻底摆脱函数依赖带来的异常,但它是3NF呀,4NF虽然可能没有彻底解决双非多值带来的异常,但它是4NF。
我之所以会想这么多,就是步入误区了,我感觉0129发的那道题,答案不对呀,我在CBD中插入一个元组,并没有保持它原本的双非多值呀。这个思维是错的,当我们判断一种分解方式,如将模式分解为3NF,BCNF,是否正确,不是看我插入一个或删除一个元组,原本函数依赖是否不被破坏,而是根据定义BCNF、3NF各自的定义去判断的。又如我们在进行分解为3NF,BCNF时,都是要始终考虑原模式的函数依赖和无损连接的,只要跟着策略始终关注,那么求出的就是BCNF,就是3NF。
举个书上的例子,(学生S,教师T,课程J),它是3NF,那我在3NF种插入个元组,这个元组和已在的一个元组有点联系,S不一样,J不一样,但T一样(毕竟依赖时是一种语义,这样插入时也没破坏什么完整性,当然可能是我没接触到),这样插入后原本的函数依赖T→S就被破坏了呀,但你就就此否定它是3NF啦?这和我一开始步入的误区是一样的。你要说它不是3NF,你得给我什么证据,你得告诉我存在某个非主属性函数确定某个非主属性或者某个非主属性部分依赖候选码,要类似于违背3NF定义的证据。
而分解为4NF的话,就是要在BCNF基础上再考虑双非多值,按照策略分解出的就是4NF,而0129发的那题的答案就是按照策略求解出来的,我要说它不是4NF,我就得找到,这其中存在的双非多值。
最后补充一句,无损链接是基础要求,不管分解成什么,你都要无损连接。判断是否保持函数依赖,判断是否有无损连接性,判断是否分解成了3NF,各自的要求是不一样的,前两者出问题,那整个模式分解就是错的,而分解没问题还要看看是否达到3NF的标准。有功夫判断是否无损,说不定一看就看出哪哪哪不满足3NF定义了。