欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

数据库设计三大范式

程序员文章站 2022-07-20 19:13:43
面试的时候经常被问,数据库设计三大范式,网上版本超级多,有的好难理解,就看这个容易理解... https://www.cnblogs.com/waj6511988/p/7027127.html ......

数据库设计三大范式

所谓的范式其实就是规则,要设计好一个结构合理的关系型数据库,必须满足一定的规则。
在实际开发中,最常见的设计范式有三个:

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

相关标签: 数据库