数据库三范式
范式:建立科学的,规范的的数据库可以有效提升数据的存储性能,这是需要满足一些规范的来优化数据数据存储方式。在关系型数据库中这些规范就可以称为范式。
1NF:所有字段值都是不可分解的原子值
第一范式:当关系模式R的所有属性都不能在分解为更基本的数据单位时,称R是满足第一范式的,简记为1NF。
若数据库有“地址”这个字段,存储格式为“河南省郑州市高新区人民路2号”。系统中经常性使用“城市”来进行操作,这时地址字段是可拆分存储的,为了符合第一范式,应该拆分成“省份”+“城市”+“具体地址”两个字段来进行存储。
用户信息表:
编号 | 姓名 | 省份 | 城市 | 具体地址 |
---|---|---|---|---|
1 | 张大强 | 河南 | 郑州 | 高新区人民路2号 |
2 | 王六 | 河南 | 开封 | 顺河回族区明伦街85号 |
2NF:确保数据库表中每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。
第二范式:如果关系模式R满足第一范式,并且R得所有非主属性都完全依赖于R的每一个候选关键属性,称R满足第二范式,简记为2NF。
一个订单可能对应多个商品,所以设计订单表可能会将“订单编号”和“商品编号”两个字段作为联合主键。
订单编号 | 商品编号 | 商品名称 | 数量 | 单位 | 价格 | 商品描述 |
---|---|---|---|---|---|---|
10001 | 89 | 挖掘机 | 1 | 台 | 200000 | 用来挖土 |
10001 | 61 | 电脑 | 5 | 台 | 9999 | 写代码必备 |
10002 | 78 | 鞋拔子 | 2 | 个 | 5.9 | 勾鞋 |
但商品信息若也存储在订单表中,商品信息字段只依赖于“商品编号”这个主键,属于部分依赖。则应将商品信息拆分成另一张表,即一张表中只存储一种数据。应拆分成:
订单信息表:
订单编号 | 商品编号 | 数量 |
---|---|---|
10001 | 89 | 1 |
10001 | 61 | 5 |
10002 | 78 | 2 |
商品信息表:
商品编号 | 商品名称 | 单位 | 价格 | 商品描述 |
---|---|---|---|---|
89 | 挖掘机 | 台 | 200000 | 用来挖土 |
61 | 电脑 | 台 | 9999 | 写代码必备 |
78 | 鞋拔子 | 个 | 5.9 | 勾鞋 |
3NF:每一列数据都和主键直接相关,而不能间接相关。。
第三范式:设R是一个满足第一范式条件的关系模式,X是R的任意属性集,如果X非传递依赖于R的任意一个候选关键字,称R满足第三范式,简记为3NF.
比如在设计一个审批流程表的时候,可以将提交人编号作为一个外键和审批流程表建立相应的关系,而不可以在审批流程表中添加关于提交人其他信息(比如姓名、电话)的字段,如下面这两个表所示的设计就是一个满足第三范式的数据库表。
审批流程表:
流程编号 | 流程名称 | 当月提交次数 | 提交人编号 |
---|---|---|---|
001 | 请假 | 3 | 1 |
002 | 拨款采购 | 6 | 1 |
提交人信息表:
提交人编号 | 提交人姓名 | 提交人电话 |
---|---|---|
1 | 郝厉害 | 13838386666 |
2 | 王麻子 | 15224667878 |
在查询流程信息的时候,就可以使用提交人编号来引用提交人信息表中的记录,也不必在订单信息表中多次输入提交人信息的内容,减小了数据冗余。