数据库设计三大范式
数据库设计三大范式
所谓的范式其实就是规则,要设计好一个结构合理的关系型数据库,必须满足一定的规则。
在实际开发中,最常见的设计范式有三个:
1.第一范式(确保每列保持原子性)
这是最基本的范式,要求表中的所有字段值都是不可分解的原子值。举个例子,某些数据库系统要用到“地址”这个属性,本来直接将这个“地址”属性存储到一个字段里就可以了。但是如果系统会经常访问“地址”属性中的城市部分,那么就得将“地址”这个属性重新拆分成国别、省份、城市、县、乡等详细的各个部分进行存储,这样对地址中某一部分操作的时候会特别方便,如下表所示:
id | 姓名 | 省份 | 城市 | 详细地址 |
---|---|---|---|---|
1 | 老王 | 江苏 | 南京 | *** |
2 | 老李 | 浙江 | 杭州 | *** |
上边的表格就遵循了第一范式的要求,这样对用户按照城市进行分类的话就非常方便了。
2.第二范式(确保表中每列都和主键相关)
第二范式在第一范式的基础之上,第二范式要求数据库表中的每列必须和主键相关,而不是跟主键中的某一部分相关。即,在同一张表里只能保存一种类型的数据,不能毫不相关的数据都扔到一张表里。如下表所示:
订单编号 | 商品编号 | 商品名称 | 客户 | 所属单位 | 联系方式 |
---|---|---|---|---|---|
001 | 1 | 挖掘机 | 老王 | 南京皮革产 | 010-1234567 |
002 | 2 | 叉车 | 老李 | 阿里巴巴 | 010-1234567 |
这样设计表格的话,商品名称实际上不与主键订单编号相关,不满足第二范式。我们将其拆分成如下的表格:
--------------------------订单信息表--------------------------
订单编号 | 商品编号 |
---|---|
001 | 1 |
002 | 2 |
--------------------------订单项目表--------------------------
订单编号 | 客户 | 所属单位 | 联系方式 |
---|---|---|---|
001 | 老王 | 南京皮革产 | 010-1234567 |
002 | 老李 | 阿里巴巴 | 010-1234567 |
--------------------------商品信息表--------------------------
商品编号 | 商品名称 |
---|---|
1 | 挖掘机 |
2 | 叉车 |
这样设计就可以了
3.第三范式(确保每列都和主键列直接相关,而不是间接相关)
第三范式需要确保每列都和主键列直接相关而不是间接相关。比如在设计订单数据表的时候,可以把客户编号作为一个外键与订单表简历相应的联系。如下两张表就满足第三范式:
--------------------------订单信息表--------------------------
订单编号 | 订单项目 | 业务员 | 订单数量 | 客户编号 |
---|---|---|---|---|
001 | 挖掘机 | 李静 | 3 | 1 |
002 | 叉车 | 刘天 | 4 | 2 |
--------------------------客户信息表--------------------------
客户编号 | 客户名称 | 所属公司 | 联系方式 |
---|---|---|---|
1 | 李白 | 中国银行 | 12123214126 |
2 | 杜甫 | 建设银行 | 13124354363 |
这样在查询订单信息的时候,就可以使用客户编号来引用客户信息表中的记录,也不必在订单信息多次输入客户信息减少了数据的冗余。
本文地址:https://blog.csdn.net/weixin_43456170/article/details/110674005