原因:
对于三范式总是学了又忘o(︶︿︶)o ,所以在这做记录,同时也希望帮助其他同学。
说明:
以下解释没有官方的解释和说明,如果错误请大家指正,多谢。
正文:
注意:蓝色字体为主键。
1.第一范式:原子性。化学中的原子是物质的最小不能分割的单位,在这也同样是这个意思。举例
uname address
小明 xx省yy市
而实际查询时,我们只需要小明是位于哪个市,这时我们可以把address取出来再进行分割, 但这种处理方法不能解决根本的问题。因此需重新设计:
uname province city
小明 xx yy
2.第二范式:完全依赖主键。这个含义稍微难理解。
2.1:先理解依赖二字的含义。举例:
tel(主键,电话号码) name(姓名)
在这个表中,主键是电话号码,属性有姓名,而我们姓名是不可能由tel来决定的。所以 这个表的设计是毫无意义的,这里叫不依赖。
2.2:再理解部分依赖。口语就是:依赖其中的一部分。这里我们要引入联合主键。举例:
身份证 学号 生日
id sno birthday
xx1003yy 49 10月3号
而我们的生日只是由联合主键中的身份证这个主键决定的,和学号没有关系。因此,生日 只是由联合主键的一部分决定的,这就叫做部分依赖。
2.3:完全依赖。。主键完全决定非主键属性,当我们只把id设为主键,而sno为非主键时,生日就完全依赖id了。
3.第三范式:消除传递依赖。文字说明;A决定B,B决定C,得到A可以决定C,这就叫做传递性。第三范式要消除这种关系。
举例:
学号决定学院,学院决定了宿舍的位置,这时,学号间接的决定了宿舍的位置
学号 学院 宿舍位置
sno dept location
0113449 软件 宁庐
解决方法:拆成两个表
sno dept(外键)
dept location
4.如果不遵循范式,会造成修改异常,删除异常,插入异常等问题,具体解释可见这个博友的文章:http://blog.sina.com.cn/s/blog_46d817650100yj2i.html