- 论坛徽章:
- 0
|
恩, 偶来在深入解释一下正规化的概念
在这之前要先说一下, 关系表的概念, 只要是每行数据都可以不重复, 这样的表就是一个关系表
现在来看一下上面的例子
name company company_address url1 url2
这个表就不是一个关系表, 为什么这么说呢, 问题出在url1和url2上
这两个字段具有相同的意义, 因此
name company company_address url1 url2
和
name company company_address url2 url1(请注意它们的次序)
可以是完全一样的记录, 也就是说这样的结构不能防止重复记录的出现
使它变成关系表的方法 就如上面说的变成这样
name company company_address url
不过, 上面说一定要加入的那个逻辑主键, 有些不以为然, 即使没有加入这个主键, 这个表已经完成了一级正规化了,
一级正规化的定义就是: 表中的每一行记录都和其他记录不同(只要满足关系表的要求也就满足了一级正规化的要求)
接下来定义表的主键
主键的定义是能够确定其它字段值的字段集(主键是可以由多个字段复合的)
再来看这个例子,
name company company_address url
用名字可以确定一个人, 同时也就知道了他的公司和他收藏的URL
那么用名字做主键是不是达到了第二级正规化的要求了呢?
没有, 原因是如果知道了公司也就知道了公司地址, 换句话说, 在这样一个表中company_address没有对主键发生依赖关系,
第二级正规化的定义就是, 所有非主键字段都和主键有依赖关系
那么如何对这个表做第二级正规化呢? 其实很简单
只要把公司也变成一个主键就可以了
name(PK) company(PK) company_address url
接下来, 来讨论第三级正规化
第三级正规化的定义是, 所有非主键字段必须且只能对全部主键有依赖关系(严格的说, 只要做到必须就是三级了而又做到只能就是所谓的B级-BNF介于三四之间的一级)
上面那个表就不满足要求, 因为url可以只由name来决定, 而company_address则只由company来决定
那么怎样做第三级正规化呢? 其实很简单, 只要把去有不完全关系的字段分离出来单独做表, 建主键就OK了
就是这样两个表
name(PK) company(FK) url
company(PK) company_address
至此, 在这个简单的例子已经没有更高的正规化形式了
通常, 做到这个程度就够了
那么第四级正规化, 又是什么样子呢?
偶就不举例子了, 只给一个定义
第四级正规化的定义是, 所有主键字段必须相互独立, 就是主键之间没有依赖关系
至于第五级正规化, 咳咳, 因为从来不用, 偶已经忘光了
大概是说外键之间不能有依赖性吧 |
|