数据库三范式
1.第一范式(确保每列保持原子性)
第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。
第一范式规定关系的每一个分量必须是一个不可分的数据项。
eg:
导师
|
专业
|
研究生
|
|
张三 李四 |
导师
|
专业
|
研究生1
|
研究生2
|
|
张三 |
李四 |
2.第二范式
第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。
也就是说列必须完全依赖于主键。
eg:
比如要设计一个订单信息表,因为订单中可能会有多种商品,所以要将订单编号和商品编号作为数据库表的联合主键,如下表所示。
订单信息表
这样就产生一个问题:这个表中是以订单编号和商品编号作为联合主键。这样在该表中商品名称、单位、商品价格等信息不与该表的主键相关,而仅仅是与商品编号相关。所以在这里违反了第二范式的设计原则。
而如果把这个订单信息表进行拆分,把商品信息分离到另一个表中,把订单项目表也分离到另一个表中,就非常完美了。如下所示。
这样设计,在很大程度上减小了数据库的冗余。如果要获取订单的商品信息,使用商品编号到商品信息表中查询即可。
3.第三范式
第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。
也就是要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。
eg:
在专业系信息表中,有系ID,系名称,系简介等,那么在学生信息表中,就不能再将系名称,系简介等再加入学生信息表中。
学生信息表:
学号 | 姓名 | 年龄 | 家庭地址 | 系名 |
001 | 小文 | 22 | 温州市DD县DD镇 | 英语 |
002 | 小红 | 21 | 温州市AA县AA镇 | 数学 |
专业系信息表:
系ID | 系名 | 系简介 |
0001 | 英语 | FADASDFA |
0002 | 数学 | 24232423 |
这两个表中的系名就出现了冗余。可以改用系ID(外键)关联。
参考(转):百度百科
http://www.cnblogs.com/linjiqin/archive/2012/04/01/2428695.html
http://www.cnblogs.com/wenzichiqingwa/archive/2012/11/07/2758128.html