数据库中的三范式

362 阅读3分钟
范式名字定义人话例子
第一范式所谓第一范式(1NF)是指在关系模型中,对于添加的一个规范要求,所有的域都应该是原子性的,即数据库表的每一列都是不可分割的原子数据项,而不能是集合,数组,记录等非原子数据项。即实体中的某个属性有多个值时,必须拆分为不同的属性。在符合第一范式(1NF)表中的每个域值只能是实体的一个属性或一个属性的一部分。简而言之,第一范式就是无重复的域。列不可分比如属性地址,可以分为省,市,区,街道。而不要只用一个“地址”这样的属性全表示
范式名字定义人话例子
第二范式第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。第二范式(2NF)要求数据库表中的每个实例或记录必须可以被唯一地区分。选取一个能区分每个实体的属性或属性组,作为实体的唯一标识。例如在员工表中的身份证号码即可实现每个一员工的区分,该身份证号码即为候选键,任何一个候选键都可以被选作主键。在找不到候选键时,可额外增加属性以实现区分,如果在员工关系中,没有对其身份证号进行存储,而姓名可能会在数据库运行的某个时间重复,无法区分出实体时,设计辟如ID等不重复的编号以实现区分,被添加的编号或ID选作主键。(该主键的添加是在ER设计时添加,不是建库时随意添加)表中每一个属性都完全依赖于主键,而不是主键的某一部分属性就是要拆表

比如要设计一个订单信息表,因为订单中可能会有多种商品,所以要将订单编号和商品编号作为数据库表的联合主键,如下表所示。

订单信息表

2012040114063976.png 这样就产生一个问题:这个表中是以订单编号和商品编号作为联合主键。这样在该表中商品名称、单位、商品价格等信息不与该表的主键相关,而仅仅是与商品编号相关。所以在这里违反了第二范式的设计原则。

而如果把这个订单信息表进行拆分,把商品信息分离到另一个表中,把订单项目表也分离到另一个表中,就非常完美了。如下所示。

2012040114082156.png

范式名字定义人话例子
第三范式在2NF基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)每一列数据都和主键直接相关,而不能间接相关。就是通过主键能推出每一列属性

ref:

数据库范式_百度百科 (baidu.com)

www.baidu.com/s?ie=utf-8&… 内核设计剖析 pdf &oq=tomcat%2520%25E5%2586%2585%25E6%25A0%25B8%25E5%2589%2596%25E6%259E%2590%2520pdf&rsv_pq=c951a7db0002ca43&rsv_t=133cPRk8VaGCTRH0yWV%2B2aLlERIG57FhBZka5Sv82xehNSu8xiJJ6sdRXfYH9D%2BCWr4gxQ&rqlang=cn&rsv_enter=1&rsv_dl=tb&rsv_btype=t&inputT=984&rsv_sug3=70&rsv_sug1=8&rsv_sug7=100&rsv_sug2=0&rsv_sug4=1890