数据库三范式,根据某个场景设计数据表

概要:

目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。
第一范式(1NF):是指在关系模型中,对域添加的一个规范要求,所有的域都应该是原子性的,即数据库表的每一列都是不可分割的原子数据项,而不能是集合,数组,记录等非原子数据项。即实体中的某个属性有多个值时,必须拆分为不同的属性。在符合第一范式(1NF)表中的每个域值只能是实体的一个属性或一个属性的一部分。简而言之,第一范式就是无重复的域。
第二范式(2NF):在1NF的基础上,非码属性必须完全依赖于候选码(在1NF基础上消除非主属性对主码的部分函数依赖),要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列,以存储各个实例的唯一标识。简而言之,第二范式就是在第一范式的基础上属性完全依赖于主键。
第三范式(3NF):在2NF基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)。第三范式(3NF)是第二范式(2NF)的一个子集,即满足第三范式(3NF)必须满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个关系中不包含已在其它关系已包含的非主关键字信息。


例子:

  1. 第一范式(1NF):确定每一列的原子性。每一列都是最小的数据单元,既满足第一范式。
    数据库三范式,根据某个场景设计数据表_第1张图片
    2.第二范式(2NF):非键字段必须依赖于键字段。如果一个关系满足1NF,并且除了主键以外的其它列,都依赖与该主键,则满足二范式(2NF),第二范式要求每个表只描述一件事。

    商品销售表:

Id 1001
订单编号 Aaaa
产品编号 Bbbb
订购日期 2018-7-18
商品价格 20

而实际上,产品编号与订单编号并没有明确的关系,订购日期与订单编号有关系,因为一旦订单编号确定下来了,订购日期也确定了,价格与订单编号也没有直接关系,而与产品有关,所以上面的表实际上可以拆分:

订单表:

订单编号 Aaaa
订购日期 2018-7-18

产品表:

产品编号 Bbbb
商品价格 20

3.第三范式(3NF):在1NF基础上,除了主键以外的其它列都不传递依赖于主键列,或者说: 任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)。

用户信息表:

主键 1001
微信号 dba
手机号 110
姓名 数据库管理员

在这里,表中存在依赖传递,例如:[微信号,手机号]–>[姓名] [微信号]–>[姓名] [手机号]–>[姓名],所以在这里的微信号和手机号冗余了。


参考:

[1] https://blog.csdn.net/zymx14/article/details/69789326
[2] https://blog.csdn.net/QingKing520/article/details/52937728
[3] https://www.cnblogs.com/wujianrui/p/7077864.html
[4] https://www.cnblogs.com/zhaideyou/p/5932220.html
[5] https://blog.csdn.net/dove_knowledge/article/details/71434960

你可能感兴趣的:(数据库)