6.1 问题的提出
6.2规范化
6.2.1 函数依赖
1.定义
设 R(U) 是一个属性集U上的关系模式, X 和 Y 是 U 的子集。若对于 R(U) 的任意一个可能的关系 r ,r 中不可能存在两个元组在 X 上的属性值相等, 而在 Y 上的属性值不等, 则称 “ X 函数确定 Y ” 或 “ Y 函数依赖于 X ”,记作 X→Y。
该说不说,书上定义的是真抽象。
如果有两个属性组,通过X内的属性组能得到Y的属性,记作X→Y,称作Y函数依赖于X。
分类
平凡的函数依赖:如果 X→Y ,但 Y属于X ,则称 X→Y 是非平凡的函数依赖(这就是太平凡了,你都属于人家,那肯定能得到你。或者说这叫废话的函数依赖)
非平凡的函数依赖:若 X→Y ,但Y不属于X , 则称 X→Y 是平凡的函数依赖。(这才是我们理解的正常依赖)
完全函数依赖:若X→Y ,并且对于 X 的任何一个真子集 X’ ,都有X'得不到Y , 则称 Y 对 X 完全函数依赖(Y完全依赖X了,依赖上了他的全部,以至于X的部分都不能得出Y,必须是全部的X,就是说,Y爱全部的X,但不爱部分的X)
部分函数依赖:若X→Y,但是Y对X不是完全函数依赖(也就是说X中有不重要的属性,他推不出Y)
传递函数依赖: 在 R(U) 中,如果X→Y,且Y→Z 则称 Z 对 X 传递函数依赖。(传递性)
6.2.2 码
候选码:设 K 是R中的 一个属性组,若K能得到全部的R中的属性,且R完全依赖于K, 则 K 称为 R 的侯选码(Candidate Key)。
超码:如果R部分依赖于K,则R为K的超码(超码是能推出所有属性的属性组的集合)
主码:候选码不止一个的时候,选定其中的一个作为主码
主属性:包含在任何一个候选码中的属性
非主属性:不包含在任何候选码中的属性
全码:整个属性组都为码(这也就说明这个属性组中的属性是各个独立的,谁也推不出谁)
外码:R 中属性或属性组X 并非 R的码,但 X 是另一个关系模式的码,则称 X 是R 的外部码(Foreign key)也称外码。
6.2.3范式
1NF:1NF就是属性不可再分的,在数据库中所有属性都是1NF,
6.2.4 2NF
若R∈1NF,且每一个非主属性完全函数依赖于任何一个候选码,则R∈2NF,(也就是说,2NF的目的就是消除部分函数依赖。)
例如:
在这个例子中,我们要先求出他的候选码:
怎么求候选码呢?
首先,只在左边出现的属性,一定是属于候选码的属性,其次两边都出现的,可能是候选码的属性,只在右边出现的,一定不是属于候选码的,在这个例子中,只出现在左边的,是Sno,Cno,所以他俩一定是属于候选码的,然后,用这两个属性,我们判断一下,能不能推出所有候选码,可以看到,他俩是能推出所有其他属性的,所以候选码就是(Sno,Cno),
判断是否2NF
这时候再看,Mname这个属性,只需要Sno和Sdept就能推出,而不用Cno了,所以Mname部分依赖于(Sno,Cno)这个候选码,所以我们需要拆分分成如图所示的SC、SD。
6.2.5 3NF
在2NF的基础上,关系模式 R<U,F> 中若不存在这样的码 X 、属性组 Y 及非主属性 Z (Z不属于Y), 使得X→Y,Y→Z成立,Y不属于X ,则称 R<U,F> ∈ 3NF, (3NF就是消除非主属性对码的传递依赖。)也就是说 ,3NF的非主属性既不部分依赖于候选码,也不传递依赖于候选码
例:
同理也是,SC的候选码为(Sno,Cno),SD为(Sno)
SC不用管,SD中的Mname传递依赖于Sno,所以要消除这个,就把他们分开。
6.2.6 BCNF
关系模式 R<U,F>∈1NF,若X→Y且 时 X 必含有码,则 R<U,F>∈BCNF。(消除非平凡且非函数依赖的多值依赖)
大白话就是说在所有依赖中,左边必定含有码。