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的基础上消除主属性对于码的部分和传递函数依赖

  因此需要将上表拆分成两个表:

  仓库(仓库名,管理员)

  库存(仓库名,物品名,数量)