http://www.zhihu.com/question/24696366
数据库泛型就是数据库应该遵循的规则,也称为范式
1NF:所有的域都是原子性的,即表的每一列都是不可分割的原子数据项,不能是集合、数组、记录等非原子数据项。即实体中的某个属性有多个子属性时,必须拆分为不同的属性。第一范式是对关系型数据库的最低要求
2NF:在1NF的基础上,非码属性必须完全依赖于码(码:关系中的某个属性或某几个属性的组合,用于区分每个元组,元组可以理解为表中每条记录)
1NF存在的问题:
1)数据冗余:表中学号、姓名、系名、系主任数据冗余严重
2)插入异常:无法插入一个没有学生的新系(主属性不能为空,码包含的属性为主属性)
3)删除异常:删除一个系的所有学生,将导致系和系名被删除
4)修改异常:假设李小明转系到法律系,需要修改李小明的所有三条记录
2NF在1NF的基础上,要求非码属性必须完全依赖于码,即非码属性不能部分依赖于码
为了消除部分函数依赖,必须将大数据表拆分成两个或更多的小数据表:
形成两张表:
3NF:在2NF的基础上,消除了非主属性对于码的传递函数依赖
2NF存在的问题:
1)插入异常:无法插入一个没有学生的新系
2)删除异常:删除所有学生将导致系消失
在2NF中,可能存在非码属性传递函数依赖于码,如学号--系名--系主任
为了消除传递函数依赖,需要继续拆分表:
形成三张表:
符合3NF要求的数据库设计,基本上解决了数据冗余过大、插入异常、删除异常、修改异常等问题
BCNF范式:
假设:
1. 某公司有若干个仓库
2. 每个仓库只能有一名管理员,一名管理员只能在一个仓库中工作
3. 一个仓库中可以存放多种物品,一种物品也可以存放在不同的仓库中。每种物品在每个仓库中都有对应的数量
则关系模式 仓库(仓库名,管理员,物品名,数量) 属于3NF范式:
码:(管理员,物品名),(仓库名,物品名)
主属性:仓库名、管理员、物品名
非主属性:数量
非主属性完全依赖于码、同时不存在非主属性对于码的传递函数依赖,所以属于3NF范式
这张表存在的问题:
1)无法新增未指派管理员、未存放物品的仓库
2)清空仓库会删除仓库和管理员信息
3)仓库更换管理员,将修改该仓库的每一条记录
造成3NF范式存在这些问题的主要原因是:存在主属性对于码的部分函数依赖或传递函数依赖:主属性仓库名 对于 码(管理员、物品)存在部分函数依赖
BCNF在3NF的基础上消除主属性对于码的部分和传递函数依赖
因此需要将上表拆分成两个表:
仓库(仓库名,管理员)
库存(仓库名,物品名,数量)