目前关系型数据库设计规范中,我们通常用的,说的最多是:
第一范式:要求数据库表中的每一列都是不可分割的原子数据项。
第二范式:数据表中的每一列都和主键相关,而不能只与主键的一部分相关。(主要针对的是联合主键)
第三范式:数据不能存在传递关系,即数据表中的每一列数据都和主键直接相关。
例如:
第一范式:要求数据库表中的每一列都是不可分割的原子数据项。
学号 | 姓名 | 性别 | 家庭信息 |
2019090222 | 赵钱孙李 | 男 | 河北省石家庄XXXX,3口,务农 |
2019090223 | 周吴郑王 | 男 | 河北省保定XXXX,4口,城镇 |
家庭信息这一列就不满足原子性的要求,不满足第一范式。调整结构如下:
学号 | 姓名 | 性别 | 家庭地址 | 家庭人口 | 户口类型 |
2019090222 | 赵钱孙李 | 男 | 河北省石家庄XXXX | 3口 | 务农 |
2019090223 | 周吴郑王 | 男 | 河北省保定XXXX | 4口 | 城镇 |
第二范式:(在满足第一范式情况下)数据表中的每一列都和主键相关,而不能只与主键的一部分相关。(主要针对的是联合主键)
订单编号 | 产品号 | 产品数量 | 产品折扣 | 订单金额 | 订单时间 |
201911110001 | 206 | 100 | 0.9 | 10000 | 2019111100011020 |
201911110001 | 205 | 150 | 0.88 | 10000 | 2019111100011020 |
201911110002 | 207 | 200 | 0.85 | 20000 | 2019111101011030 |
201911110002 | 208 | 300 | 0.8 | 20000 | 2019111101011030 |
同一个订单可能包含不同的产品,表中的是一个联合主键(订单编号和产品号),其中产品数量,产品折扣与联合主键相关联,订单金额和订单时间只与订单编号有关联。不满足第二范式,调整结构如下:
订单编号 | 产品号 | 产品数量 | 产品折扣 |
201911110001 | 206 | 100 | 0.9 |
201911110001 | 205 | 150 | 0.88 |
201911110002 | 207 | 200 | 0.85 |
201911110002 | 208 | 300 | 0.8 |
订单编号 | 订单金额 | 订单时间 |
201911110001 | 10000 | 2019111100011020 |
201911110002 | 20000 | 2019111101011030 |
第三范式:(在满足第二范式情况下)数据不能存在传递关系,即数据表中的每一列数据都和主键直接相关
学号 | 姓名 | 性别 | 家庭地址 | 家庭人口 | 户口类型 | 班主任姓名 | 班主任年龄 | 班主任性别 |
2019090222 | 赵钱孙李 | 男 | 河北省石家庄XXXX | 3口 | 务农 | 找别扭 | 35 | 女 |
2019090223 | 周吴郑王 | 男 | 河北省保定XXXX | 4口 | 城镇 | 王钢蛋 | 33 | 男 |
该数据表中主键是学号。班主任的年龄,性别与班主任姓名有关,与主键学号不相关,所以不符合第三范式。调整结构如下:
学号 | 姓名 | 性别 | 家庭地址 | 家庭人口 | 户口类型 | 班主任姓名 |
2019090222 | 赵钱孙李 | 男 | 河北省石家庄XXXX | 3口 | 务农 | 找别扭 |
2019090223 | 周吴郑王 | 男 | 河北省保定XXXX | 4口 | 城镇 | 王钢蛋 |
班主任姓名 | 班主任年龄 | 班主任性别 |
找别扭 | 35 | 女 |
王钢蛋 | 33 | 男 |