MySQL 数据库范式化设计理论


Posted in MySQL onApril 22, 2022

一、设计范式

问题: 什么是范式化设计,为什么需要反规范化设计 ?

范式来自来自英文Normal From 。开发过程中要设计一个好的数据库逻辑关系,必须满足一定的约束条件,此约束条件形成了开发范式,分成几个等级,一级比一级严格。

满足这些范式理论上可以让我们的数据库逻辑结构更加简洁、清晰。

以下是常见的四种范式:

  • 第一范式(1NF)
  • 第二范式(2NF)
  • 第三范式(3NF)
  • 第四范式(BCNF)

1.第一范式(1NF)

  • 每一列都是不可再分的属性值,确保每一列的原子性;
  • 两列的属性相近或者相似或者一样,尽量合并属性一样的列,确保不产生冗余数据;
  • 单一属性的列为基本数据类型构成;
  • 设计出来的表都是简单的二维表。

举例:用户收货地址 反例:

姓名 电话 地址
张三 138000000 北京市-朝阳区-酒仙桥街道

正例:

姓名 电话 街道
张三 138000000 - 北京市 朝阳区 酒仙桥街道

总结:每列都是不可再分的原子值(一个列不可再分,比如通讯地址和省、市、区)

2.第二范式(2NF)

  • 第二范式(2NF)是在第一范式的基础上建立起来的。
  • 第二范式(2NF)要求实体的属性完全依赖与主键关联。所谓完成依赖是指不能存在与存在依赖关键字的部分属性,如果存在那么这个属性和关键字部分应该分离出来形成一个新的实体,新实体与原实体是一对多的关系。

反例:

产品 ID 用户ID 产品名称 用户姓名 购买数量 下单时间
100 1 微波炉 A102 王麻子 1 2022-08-08

正例: 订单表

产品 ID 用户ID 购买数量 下单时间
100 1 1 2022-08-08

产品表

产品 ID 产品名称
100 微波炉 A102

用户表

用户ID 用户姓名
1 王麻子

总结:消除列对主键的部分函数依赖(对于组合主键的部分依赖,比如:产品ID + 用户ID 为主键,存在用户名称,产品名称等部分主键依赖字段)

3.第三范式 (3NF)

  • 满足第三范式(3NF)必须满足第二范式(2NF)。
  • 第三范式(3NF) 要求一个数据表中不包含已在其他表中包含的非主键关键字信息,即数据不能存在传递关系,即每个属性都跟主键有关系直接关系而不是间接关系。

反例:

订单ID 用户ID 产品ID 产品名称 产品厂家
1 1 100 微波炉 A102 美的
2 2 200 变频空调 B101 海尔

正例: 订单表

订单ID 用户ID 产品ID
1 1 100
2 2 200

商品信息表

产品ID 产品名称 产品厂家
100 微波炉 A102 美的
200 变频空调 B101 海尔

总结:消除字段对非主键的传递依赖(就是需要取消订单中比如商品名称、商品地址等冗余信息)。

二、范式化设计

在真正的数据库规范定义上,非常的严谨,比如第二范式(2NF)的定义“若某关系 R 术语第一范式,且每个非主属性完全函数依赖于候选码,则关系 R 属于第二范式”。

结论:并不是说完全符合规范化理论的设计是最完美的设计,而是要看具体的业务场景反复实践总结最合适的设计。

三、反规范化设计

所谓反规范化设计,就是针对规范化而言的。 1、为了性能和读取效率而适当的违反对数据库范式设计的要求; 3、为了查询的性能,允许存在部分(少量)冗余数据。换句话说,反规范化设计就是直接用空间换时间。

  • 商品信息
ID 商品名称 商品价格 商品描述 商品图片地址
1 微波炉 A101 $100.99 可以加热食物的微波炉 tupian.baidu.com
  • 分类信息
分类 ID 分类名称
1 电器
  • 商品分类对应关系表
商品ID 分类ID
1 1
  • 商品信息反规范化设计
ID 商品名称 分类名称 商品价格 商品描述 商品图片地址
1 1 电器 $100.99 可以加热食物的微波炉 tupian.baidu.com

四、设计总结

  • 数据库的规划化范式设计,在逻辑结构上可以让结构更加细粒度,容易理解。
  • 但是我们在实际的开发过程中,需要考虑性能和时间成本,往往或多或少,会允许数据冗余(反规范化设计),通常可以达到 2NF。

到此这篇关于MySQL 数据库范式设计理论就介绍到这了!


Tags in this post...

MySQL 相关文章推荐
MySql学习笔记之事务隔离级别详解
May 12 MySQL
正确使用MySQL INSERT INTO语句
May 26 MySQL
Mysql效率优化定位较低sql的两种方式
May 26 MySQL
一篇文章带你深入了解Mysql触发器
Aug 02 MySQL
MySQL利用UNION连接2个查询排序失效详解
Nov 20 MySQL
一文弄懂MySQL中redo log与binlog的区别
Feb 15 MySQL
Arthas排查Kubernetes中应用频繁挂掉重启异常
Feb 28 MySQL
面试中老生常谈的MySQL问答集锦夯实基础
Mar 13 MySQL
Mysql InnoDB 的内存逻辑架构
May 06 MySQL
深入理解MySQL中MVCC与BufferPool缓存机制
May 25 MySQL
MySQL控制流函数(-if ,elseif,else,case...when)
Jul 07 MySQL
MySQL池化框架学习接池自定义
Jul 23 MySQL
MySQL提取JSON字段数据实现查询
mysql使用FIND_IN_SET和group_concat两个方法查询上下级机构
Apr 20 #MySQL
在MySQL中你成功的避开了所有索引
Apr 20 #MySQL
mysql中如何用命令创建联合唯一索引
Apr 20 #MySQL
mysql 8.0.27 绿色解压版安装教程及配置方法
MySQL去除密码登录告警的方法
Apr 20 #MySQL
MySQL数据库事务的四大特性
You might like
ThinkPHP3.2.2的插件控制器功能简述
2014/07/09 PHP
php学习笔记之面向对象
2014/11/08 PHP
php通过执行CutyCapt命令实现网页截图的方法
2016/09/30 PHP
php生成图片缩略图功能示例
2017/02/22 PHP
Mac下关于PHP环境和扩展的安装详解
2019/10/17 PHP
JavaScript中使用构造函数实现继承的代码
2010/08/12 Javascript
Javascript 面向对象编程(coolshell)
2012/03/18 Javascript
window.onload与$(document).ready()的区别分析
2015/05/30 Javascript
Angular2表单自定义验证器的实现
2016/10/19 Javascript
JavaScript中的await/async的作用和用法
2016/10/31 Javascript
JavaScript与JQUERY获取元素的宽、高和位置
2017/02/26 Javascript
JavaScript中的FileReader图片预览上传功能实现代码
2017/07/24 Javascript
ionic App问题总结系列之ionic点击系统返回键退出App
2017/08/19 Javascript
JavaScript实现异步图像上传功能
2018/07/12 Javascript
Vue 通过自定义指令回顾v-内置指令(小结)
2018/09/03 Javascript
vue-cli3 karma单元测试的实现
2019/01/18 Javascript
通过jQuery学习js类型判断的技巧
2019/05/27 jQuery
Nodejs使用archiver-zip-encrypted库加密压缩文件时报错(解决方案)
2019/11/18 NodeJs
[01:02:17]2014 DOTA2华西杯精英邀请赛 5 24 DK VS VG
2014/05/26 DOTA
[00:56]2014DOTA2国际邀请赛 DK、iG 赛前探访
2014/07/10 DOTA
python 2.6.6升级到python 2.7.x版本的方法
2016/10/09 Python
python日志记录模块实例及改进
2017/02/12 Python
利用信号如何监控Django模型对象字段值的变化详解
2017/11/27 Python
python3+PyQt5 创建多线程网络应用-TCP客户端和TCP服务器实例
2019/06/17 Python
Python关键字及可变参数*args,**kw原理解析
2020/04/04 Python
keras分类模型中的输入数据与标签的维度实例
2020/07/03 Python
CSS实现聊天气泡效果
2020/04/26 HTML / CSS
html5 初试 indexedDB(推荐)
2016/07/21 HTML / CSS
详解使用HTML5 Canvas创建动态粒子网格动画
2016/12/14 HTML / CSS
盛大二次面试题
2016/11/18 面试题
土地转让协议书范本
2014/04/15 职场文书
学习教师敬业奉献模范事迹材料思想汇报
2014/09/19 职场文书
村主任群众路线教育实践活动个人对照检查材料思想汇报
2014/10/01 职场文书
2015入党个人自传范文
2015/06/26 职场文书
2019新员工试用期转正申请书3篇
2019/08/13 职场文书
如何在Mac上通过docker配置PHP开发环境
2021/05/29 PHP