1 第一范式

该范式是为了排除 重复组 的出现,因此要求数据库的每个列的值域都由原子值组成;每个字段的值都只能是单一值。1971年埃德加·科德提出了第一范式。即表中所有字段都是不可再分的。

1.1 实例

重复组通常会出现在会计账上,每一笔记录可能有不定个数的值。

  • 举例来说:

“数量”就是所谓的重复组了,而在这种情况下这份资料就不符合第一范式。

  • 再比如,如下联系方式是一个复合属性,就违反了该范式,在数据库中是无法分离出来的。

1.2 解决方案

  • 想要消除重复组的话,只要把每笔记录都转化为单一记录即可:
  • 简单改动即可

即标准的二维表结构。

2 第二范式

前提:标准的二维表,即第一范式成立

表中必须存在业务主键,并且非主键依赖于全部业务主键。

2.1 实例

如下博客表

  • 用户字段作为PK是否可行?
    一个用户会对应多个博客记录,且章节标题也能为多个用户所编辑,所以单列字段PK失效
  • 的联合PK
    用户积分字段只和用户字段依赖,并不依赖整体的PK,依旧不符第二范式

2.2 解决方案

拆分将依赖的字段单独成表

从上面可发现:

  • 若表的PK只有一个字段,那么它本就符合第二范式
  • 若是多个字段组成,则需考虑是否符合第二范式

3 第三范式

表中的非主键列之间不能相互依赖

3.1 实例 - 课程表

一个字段的PK显然符合第二范式,大部分字段也只依赖PK。然而对于职位字段其实依赖讲师名,所以不符合第三范式。

3.2 解决方案

  • 将不与PK形成依赖关系的字段直接提出单独成表即可:

4 三范式评价

优点

  • 范式化的更新通常比反范式快
  • 当数据较好的范式化后,很少或者没有冗余数据
  • 范式化的数据比较小,放在内存中操作较快

缺点

  • 通常需要进行关联
    毕竟阿里规范提到

5 反范式(空间换时间)

反范式的过程就是通过冗余数据来提高查询性能,但冗余数据会牺牲数据一致性

优点

  • 所有的数据都在同一张表中,可以减少表关联
  • 更好进行索引优化

缺点

  • 存在大量冗余数据
  • 数据维护成本更高(删除异常,插入异常,更新异常)

在企业中很好能做到严格意义上的范式成者反范式,一般需混合使用。

6 综合案例

  1. 在一个网站实例中, 这个网站允许用户发送消息,井且一些用户是付费用户。现在想查看付费用户最近的10条信息。在user表 和message表中都存储用户类型(account type),而不用完全的反范式化。这避免了完全反范式化的插入和删除问题,因为即使没有消息的时候也不会丢失用户信息。这样也不会把user_message表搞得太大,有助高效获取数据
  2. 另一个从父表冗余些数据到子表的理由是排序的需要
  3. 缓存衍生值也是有用的。如果需要显示每个用户发了多少消息(类似论坛),可以每次执行一个昂贵的子查询来计算并显示它;也可以在user表中建个num_messages列,每当用户发新消息时更新这个值。

范式设计

  • 用户表
    用户ID、姓名、电话、地址、邮箱
  • 订单表
    订单ID、用户ID、下单时间、支付类型、订单状态
  • 订单商品表
    订单ID、商品 ID、商品价格
  • 商品表
    商品ID、名称、描述、过期时间
SELECT b.用户名, b.电话, b.地址, a.订单ID,   SUM(c.商品价价*C.商品数量) as 订单价格   // 上面这就需要三张表的关联了,可能效率就很低了FROM‘订单表` aJOIN‘用户表’b ON a用户ID=b.用户IDJOIN `订单商品表` C ON c.订单ID= b.订单IDGROUP BY b.用户名,b.电话b.地址,a.订单ID1234567

反范式设计

  • 用户表
    用户ID、姓名、电话、地址、邮箱
  • 订单表
    订单ID、用户ID、下单时间、支付类型、订单状态、订单价格、用户名、电话、地址
  • 订单商品表
    订单ID、商品 ID、商品数量、商品价格
  • 商品表
    商品ID、名称、描述、过期时间
SELECT a.用户名,a.电话.a.地址,a.订单ID,a.订单价格FROM `订单表` a1234

把用户表的地址加到了订单表,这样查询地址时,就不需要把用户表和订单表关联

参考

  • 第一范式

从第一范式到第二范式所做的操作是_给女同事讲解MySQL数据库范式与反范式,她直夸我“技术好”相关推荐

  1. 从第一范式到第二范式所做的操作是_数据库设计三大范式

    为了建立冗余较小.结构合理的数据库,设计数据库时必须遵循一定的规则.在关系型数据库中这种规则就称为范式.范式是符合某一种设计要求的总结.要想设计一个结构合理的关系型数据库,必须满足一定的范式. 在实际 ...

  2. mysql数据库代码_【代码总结】MYSQL数据库的常见操作

    ============================== MYSQL数据库的常见操作 ============================== 一.mysql的连接与关闭 -h:指定所连接的服 ...

  3. mysql导出权限授权_本文实例讲述了mysql数据库创建账号、授权、数据导出、导入操作。分享给大家供大家参考,具体如下:1、账号创建及授权grant all privileg...

    本文实例讲述了mysql数据库创建账号.授权.数据导出.导入操作.分享给大家供大家参考,具体如下: 1.账号创建及授权 grant all privileges on *.* to 'yangxin' ...

  4. mysql数据库限流方案_用于对MySQL数据库的并发操作进行控制的方法及装置的制造方法_3...

    的数据库操作特点,预先设置的所述第一限流类型可以不同于本实施例中的设置,同样可以实现本申请的技术方案,也在本申请的保护范围之内. [0103]步骤102-3:判断MySQL数据库的threads_ru ...

  5. mysql数据库mydb_mysql数据库操作语法大全

    1.连接Mysql 格式: mysql -h主机地址 -u用户名 -p用户密码 1.连接到本机上的MYSQL. 首先打开DOS窗口,然后进入目录mysql\bin,再键入命令mysql -u root ...

  6. MySQL数据库+命令大全+常用操作

    格式:mysql -h主机地址 -u用户名 -p用户密码 1. 例:连接到本机上的MYSQL 首先在打开DOS窗口,然后进入目录 mysqlbin,再键入命令mysql -uroot -p,回车后提示 ...

  7. Linux下MySql数据库常用操作

    1.显示数据库 show databases; 2.选择数据库 use 数据库名; 3.显示数据库中的表 show tables; 4.显示数据表的结构 describe 表名; 5.显示表中记录 S ...

  8. mysql和foxbase_Mysql使用基础知识和MYSQL数据库的简单操作 -(转)

    Mysql使用基础知识 有很多朋友虽然安装好了mysql但却不知如何使用它.在这篇文章中我们就从连接MYSQL.修改密码.增加用户等方面来学习一些MYSQL的常用命令. 一.连接MYSQL.格式:my ...

  9. 查询linux安装了什么数据库,Linux系统中安装MySQL数据库操作手册

    Linux系统中MySQL数据库安装手册 一.安装概述: 在Linux操作系统中安装MySQL数据库是一个我们必须要掌握的一门技术,也决定了你以后找工作的薪资待遇,所以你知道它的厉害了吧!学会安装只是 ...

最新文章

  1. clickhouse 基础知识
  2. python argparse库_Python的argparse库使用详解
  3. mysql写放大,canvas实现图片根据滑块放大缩小效果
  4. NLP:NLP领域没有最强,只有更强的模型——GPT-3的简介、安装、使用方法之详细攻略
  5. servlet 初步 (四) session
  6. Visual C++——《可视化编程技术》实验报告——绘图与文本操作
  7. 快速上手Expression Tree(一):做一做装配脑袋的Expression Tree 习题
  8. HTML是什么?HTML简介
  9. java数据库连接Druidsql失败_Druid数据库连接池异常connection holder is null
  10. Android开发动态的监听网络状态的变化
  11. 基于JAVA校内图书馆智能管理系统计算机毕业设计源码+数据库+lw文档+系统+部署
  12. 安装6.0之后,防止应用进入DOZE状态,导致无法后台请求服务器,或者其他请求。
  13. 新注册企业调查显示:近9成初创小微企业融资难
  14. 用了这么久开源社区,还搞不明白免费/自由/开源软件?
  15. 机器学习 scikit-learn GridSearchCV scoring 参数设置
  16. Arduino uno控制蜂鸣器播放音乐(以《大鱼》为例)
  17. 学习MySQLl06《存储过程与事务》
  18. android Lottie详细使用
  19. 电动车充电软件测试,电动车充电用哪个app好?6款充电app评测
  20. vue,js书籍_您应该阅读的十大Vue JS书籍

热门文章

  1. Object family 在Object search中的default逻辑
  2. Spring源代码研究之how is Bean object created
  3. SAP CRM configuration product在UI上的显示逻辑
  4. 如何处理VMware启动虚拟机时的错误信息Failed to lock the file
  5. SAP S4CRM 1811 服务订单API介绍
  6. SAP CRM Enterprise Search change pointer的存储数据库表
  7. Windows下使用python库 curses遇到错误消息的解决方案
  8. 目前电子计算机已经发展到,目前电子计算机已经发展到什么计算机?
  9. dataframe 如何选中某列的一行_如何用 Python 在笔记本上分析 100GB 数据?
  10. css animation动画完成后隐藏_css3动画简介以及动画库animate.css的使用