数据库设计的三范式和反范式

  • 范式的概念
  • 三范式
    • 范式一
    • 范式二
    • 范式三
  • 反范式
  • 总结

范式的概念

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

三范式和反范式是空间和时间的关系。三范式是为了降低空间;反范式是通过增加空间来提升运行效率。

三范式

(1)目的:减少空间占用。
(2)内容:列不可分、依赖主键(联合索引)、在依赖主键(联合索引)的基础上直接依赖。

范式一

确保每列保持原子性;数据库表中的所有字段都是不可分解的原子值。
例如:某表中有一个地址字段,如果经常需要访问地址字段中的城市属性,则需要将该字段拆分为多个字段,省份、城市、详细地址等。

姓名 地址
fly1 广西壮族自治区南宁市越秀区繁华东路66号8栋8楼8号
fly2 广东省深圳市福田区繁华东路66号8栋8楼8号
fly3 湖南省长沙市岳麓区繁华东路66号8栋8楼8号

可以才分为:

姓名 省份 详细信息
fly1 广西壮族自治区 南宁市 越秀区 繁华东路 66号 8栋8楼8号
fly2 广东省 深圳市 福田区 繁华东路 66号 8栋8楼8号
fly3 湖南省 长沙市 岳麓区 繁华东路 66号 8栋8楼8号

范式二

确保表中的每列都和主键相关,而不能只与主键的某一部分相关(组合索引)。

订单编号 商品编号 商品名称 数量 单位 价格 客户 所属单位 联系方式
1 1 电脑 1 10000 fly1 FLY 13788888888
1 2 手机 2 6000 fly1 FLY 13788888888
2 3 ipad 3 3000 fly2 BAT 13799999999

因为订单编号与客户的信息相关,订单编号和商品编号一起唯一确定数量,商品编号和商品信息相关;所以可以拆分成三个表:

订单编号 客户 所属单位 联系方式
1 fly1 FLY 13788888888
2 fly2 BAT 13799999999
订单编号 商品编号 数量
1 1 1
1 2 2
2 3 3
商品编号 商品名称 单位 商品价格
1 电脑 10000
2 手机 6000
3 ipad 3000

范式三

确保每列都和主键直接相关,而不是间接相关;减少数据冗余。

例如

订单编号 订单项目 负责人 业务员 订单数量 客户编号
1 电脑 fly1 alice 10 1
2 手机 fly2 molic 20 2
3 ipad fly3 selia 30 1

可以拆分为:

订单编号 订单项目 负责人 业务员 订单数量 客户编号 客户名称 所属公司 联系方式
1 电脑 fly1 alice 10 1 vico 0voice1 13766666666
2 手机 fly2 molic 20 2 milo 0voice2 13799999999
3 ipad fly3 selia 30 1 vico 0voice1 13766666666
客户编号 客户名称 所属公司 联系方式
1 vico 0voice1 13766666666
2 milo 0voice2 13799999999

反范式

反范式是经常使用的设计。比如用户表采用的就是反范式,因为如果用户表不采用反范式设计,将会产生很多的关联关系表,这就会涉及到联表查询,非常影响效率,特别对登录来说,是不可容忍的。

因此,反范式允许冗余存储,为了提升查询效率。

总结

  1. 范式二中,对于联合索引,主键不能依赖一部分,而要依赖整体;出现重复的要拆分。
  2. 反范式是经常使用的设计。三范式可以避免数据冗余,减少数据库的空间,减小维护数据完整性的麻烦。但是采用数据库范式化设计,可能导致数据库业务涉及的表变多,并且造成更多的联表查询,将导致整个系统的性能降低。因此处于性能考虑,可能需要进行反范式设计。

数据库设计的三范式和反范式相关推荐

  1. 数据库三范式与反范式详解(一看就懂)

    目 录 范式与反范式 1.第一范式 2.第二范式 3.第三范式 4.反范式 范式与反范式 范式化设计 通过满足下面提出的三条范式规则,尽可能的避免出现数据冗余 因为数据冗余会带来,数据UPDATE更新 ...

  2. 三十二、数据库设计的三范式【完】

    数据库设计的三范式 第一范式 数据库表中不能出现重复记录,每个字段是原子性的不能再分 不符合第一范式的示例 学生编号 学生姓名 联系方式 1001 张三 zs@gmail.com,1359999999 ...

  3. 数据库设计:范式与反范式

    三范式 第一范式(1NF):数据表中的每一列(每个字段)必须是不可拆分的最小单元,也就是确保每一列的原子性: 第二范式(2NF):满足1NF后,要求表中的所有列,都必须依赖于主键,而不能有任何一列与主 ...

  4. MySQL之库表设计篇:一到五范式、BC范式与反范式详解

    引言 MySQL的库表设计,在很多时候我们都是率性而为,往往在前期的设计中考虑并不全面,同时对于库表结构的划分也并不明确,所以很多时候在开发过程中,代码敲着敲着会去重构某张表结构,甚至大面积重构多张表 ...

  5. Java学习笔记:数据库中的范式和反范式

    范式是关系数据库理论的基础,也是我们在设计数据库结构过程中所要遵循的规则和指导方法.数据库的设计范式是数据库设计所需要满足的规范.只有理解数据库的设计范式,才能设计出率.优雅的数据库,否则可能会设计出 ...

  6. 数据库中的范式和反范式详解!

    范式是关系数据库理论的基础,也是我们在设计数据库结构过程中所要遵循的规则和指导方法.数据库的设计范式是数据库设计所需要满足的规范.只有理解数据库的设计范式,才能设计出率.优雅的数据库,否则可能会设计出 ...

  7. Java学习之数据库中的范式和反范式

    范式是关系数据库理论的基础,也是我们在设计数据库结构过程中所要遵循的规则和指导方法.数据库的设计范式是数据库设计所需要满足的规范.只有理解数据库的设计范式,才能设计出高效率.优雅的数据库,否则可能会设 ...

  8. 关系数据库的范式和反范式

    为什么80%的码农都做不了架构师?>>>    范式:英文名称是 Normal Form,它是英国人 E.F.Codd(关系数据库的老祖宗)在上个世纪70年代提出关系数据库模型后总结 ...

  9. mysql 怎么反选_MySQL 范式与反范式的选择 | 剑花烟雨江南

    对于任何给定的数据通常有很多种表示方法,从完全的范式化到完全的反范式话,以及两者的折中.在范式化的数据库中,每个事实数据会出现并只出现一次.相反,在反范式化的数据库中,信息是冗余的. 如果不熟悉范式和 ...

最新文章

  1. php内外边距,选择器与内外边距使用方法(margin,padding使用)-2019年9月4日
  2. Linux下查看进程IO工具iopp
  3. (严蔚敏版)数组的顺序存储表示和实现代码
  4. 佳能g2810打印机扫描怎么用_办公用这款佳能彩色激光打印机无线MF643CDW就够了!...
  5. Python实例讲解 -- 认识wxpython 的 Frame
  6. 面向对象与原型(二)
  7. ASP.NET深入浅出系列3- Page类
  8. 计算机专业可以转英语吗,计算机专业英语词汇转.doc
  9. Atitit MP3元数据抽取结果 音乐信息检索 取出了重复和英文的数据 一共368个。。 /bookmarksHtmlEverythingIndexPrj/src/apkg/songlistC
  10. iOS开发之音视频边下边播缓存方案
  11. 今日新闻快讯摘要十条
  12. mysql myisam转innodb_WordPressMySQL数据库MyISAM表转换InnoDB方法和修复工具
  13. Kile5安装教程和创建一个工程举例【图文STM32F407ZE芯片为例】
  14. FPGA入门经历的阶段
  15. [linux学习笔记] GCC环境安装问题
  16. 主流加密通信应用Signal在中国“失联”
  17. 基于粒子群算法的组卷系统的研究与实现
  18. VUE项目前端页面添加水印
  19. 目标人脸检测与识别(计算机视觉)
  20. 《黑天鹅》观感:成长的蜕变 --摘抄

热门文章

  1. c语言老人与海英文单词汇总,【March·翻译】老人与海(1)单词卡coil [kɔɪl
  2. 牛客-桃花——一个计算多叉树直径的问题
  3. 那些年,我熟知的影视明星(1)
  4. java 图片缩小模糊问题
  5. 程序员须知:面试中最容易被问到的18个算法题(附答案!)
  6. cad制图坐标系转换为地理坐标系
  7. 网站漏洞扫描注入批量getshell工具
  8. 网络笔记(5) 从物理层到MAC层:如何在宿舍里自己组网玩联机游戏?
  9. Self-Supervised Visual Feature Learning With Deep Neural Networks: A Survey
  10. 一份超全超详细的 ADB 用法大全