Microsoft SQL Server 2008技术内幕:T-SQL查询---------数据库正规化和其它设计主题
第一范式1NF: 表的列都是原子的
不能某一列可以被拆分成几个列(如定义购物车一列,内容为苹果一只,香蕉一斤, 不如分解为产品,数量两列,分别填上苹果, 1, 香蕉 2)
第二范式2NF:非键列不能部分依赖于部分键列(必须依赖于整个键)
如果非键列依赖于部分键,那这些非键列一定由于部分依赖而产生冗余,此时就应该把这些非键列和部分键取出来重新建一个表
非键列必须完全函数依赖于整个键列
第三范式3NF:非键列不能相互依赖
如果非键列相互依赖,那就可以取出这部分非键列重新建一个表
第三范式允许非主属性对主属性存在传递依赖(传递函数依赖性),但不允许非主属性间存在传递依赖。
Boyce-Codd范式BCNF:键列不能相互函数依赖
重新设计键列
1.数据依赖
数据依赖指的是通过一个关系中属性间的相等与否体现出来的数据间的相互关系,其中最重要的是函数依赖和多值依赖。
2.函数依赖
设X,Y是关系R的两个属性集合,当任何时刻R中的任意两个元组中的X属性值相同时,则它们的Y属性值也相同,则称X函数决定Y,或Y函数依赖于X。
3.平凡函数依赖
当关系中属性集合Y是属性集合X的子集时 存在函数依赖X→Y,即一组属性函数决定它的所有子集,这种函数依赖称为平凡函数依赖。
4.非平凡函数依赖
当关系中属性集合Y不是属性集合X的子集时,存在函数依赖X→Y,则称这种函数依赖为非平凡函数依赖。
5.完全函数依赖
设X,Y是关系R的两个属性集合,X’是X的真子集,存在X→Y,但对每一个X’都有X’!→Y,则称Y完全函数依赖于X。
6.部分函数依赖
设X,Y是关系R的两个属性集合,存在X→Y,若X’是X的真子集,存在X’→Y,则称Y部分函数依赖于X。
7.传递函数依赖
设X,Y,Z是关系R中互不相同的属性集合,存在X→Y(Y !→X),Y→Z,则称Z传递函数依赖于X。
第四范式:消除非平凡多值依赖
所谓函数依赖,即属性集A的一个值决定属性集B上的一个值
所谓多值依赖,即属性集A的一个值决定属性集B上的多个值
转自 http://www.cnblogs.com/ndxsdhy/archive/2011/04/24/2026054.html
多值依赖的定义:
设R(U)是一个属性集合U上的一个关系模式,X, Y, 和Z是U的子集,并且Z=U-X-Y,多值依赖X->->Y成立当且仅当对R的任一个关系r,r在(X,Z)上的每个值对应一组Y的值,这组值仅仅决定于X值而与Z值无关。
若X->->Y,而Z=空集,则称X->->Y为平凡的多值依赖。否则,称X->->Y为非平凡的多值依赖。
可以看出,如果把上面的一组改为一个,那么多值依赖就变成了函数依赖。当然一个值组成的组也是组,所以说,函数依赖是多值依赖的特殊情况。
如下表:
课程C 教师T 参考书B
数学 邓军 数学分析
数学 邓军 高等代数
数学 邓军 微分方程
表中,U = C+T+B,(C,T)确定一组B,但是这组B其实与T无关,仅由C确定,所以(C,T)->->B。又因为T不是空集,所以(C,T)->->B为非平凡多值依赖。
要想消除多只依赖,可以分解为:(C,T), (C,B)及
表1:
课程C 教师T
数学 邓军
表2:
课程C 参考书B
数学 数学分析
数学 高等代数
数学 微分方程
对于R中的每个非平凡多值依赖X->->Y(Y不属于X),X都含有候选码,则R属于4NF。
分析:对于每一个非平凡多值依赖X->->Y,X若含有候选码,也就是X->Y,所以4NF所允许的平凡多值依赖是函数依赖。
第五范式:消除联接依赖
反规范化 DENOMALIZATION
主要为了:性能和历史
性能:避免过多的联接操作
历史:记录历史数据
特殊化和一般化: Specialization
使用超类型,如 客户和供应商,可定义一超类型 Partner, 再定义客户,vendor表用partner id 连接.在Partner表中定义地址,名字列.