数据库监控与调优【十七】—— 表结构设计优化

表结构设计优化

第一范式(1NF)

  • 字段具有原子性,即数据库的每一个字段都是不可分割的原子数据项,不能是集合、数组、记录等非原子数据项

  • 当实体中的某个属性有多个值时,必须拆分为不同的属性

例子:

如图,student表不符合第一范式,因为地址字段不是原子性的,还可以继续拆分成省、市

并且,如果这样设计,假设以后有按照省、市进行统计或分组的需求,这样的表设计无法实现

在这里插入图片描述

可以改成以下这样,就满足第一范式(1NF)了

在这里插入图片描述

第二范式(2NF)

  • 满足1NF的基础上,要求每一行数据具有唯一性,并且非主键字段完全依赖主键字段

例子:

如果student表能够做到每一行数据具有唯一性,但是这张表里面的非主键字段并不完全完全依赖主键字段

比如,课程学分字段credit(课程学分)字段只依赖classname(课程),而不依赖no(学号)字段,也就是说credit(课程学分)字段只是部分依赖主键no(学号)字段。不符合第二范式(2NF)

在这里插入图片描述

可以改成以下这样,就满足第二范式(2NF)了

在这里插入图片描述

拆分成两张表,credit(课程学分)字段依赖classname(课程)

第三范式(3NF)

  • 满足2NF的基础上,不能存在传递依赖

例子:

student表设计如下,school_addr(学校地址)、school_phone(学校电话)字段都依赖school(学校)字段,school(学校)字段又依赖了主键id字段。也就是说school_addr(学校地址)、school_phone(学校电话)字段并不直接依赖主键id字段,而是通过school(学校)字段,传递依赖了主键id字段,这种情况下就不符合第三范式(3NF)了

在这里插入图片描述

可以改成以下这样,就满足第三范式(3NF)了

在这里插入图片描述

总结

三范式带来的好处,就是防止了冗余,一般来说,在设计表时需要遵循三范式。但是实际项目中,一些场景下也需要做一些反模式设计。

反模式设计

  • 放弃遵循三范式,适当增加冗余,从而提升查询效率

例子:

假设如下这两张表的数据都非常多,并且在查询学生信息时,总是要查询school_addr(学校地址)这个字段

在这里插入图片描述

那么就可以把school_addr(学校地址)字段冗余到student表中。这样在查询学校信息时,就不需要两张表联合查询,直接单表查询即可,从而提升性能

在这里插入图片描述

表设计原则

  • 字段少而精,建议20个以内(经验之谈),超过可以拆分
    • 把常用的字段放到一起
    • 把不常用的字段独立出去
    • 打字段(TEXT/BLOB/CLOB等)独立出去
  • 尽量使用小型字段
    • 一些场景下,用数字替代字符串
      • 比如,存储ip字段,可以用int类型代替varchar类型,可以节省空间,也可以提升性能
  • 避免使用允许为NULL的字段
    • 官方也推荐字段设置为非空
    • 允许为NULL的字段很难查询优化
    • 允许为NULL的字段的索引需要额外的空间
  • 合理平衡范式和冗余
  • 如果数据量非常大,考虑分库分表

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/764.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【广州华锐互动】机械设备事故VR模拟体验系统

随着虚拟现实技术的不断发展,越来越多的行业开始尝试将VR技术应用到实际场景中,以提供更加真实的体验。其中,机械伤害事故VR警示教育系统的出现,为机械工程师、安全培训人员等行业提供了一种全新的培训方式。在实现上,…

Linux基础

Linux root用户,cd ~ 相当于 cd /root 普通用户,cd ~ 相当于cd /home/当前用户名 注:cd - 返回进入此目录之前所在目录 rm --> remove mv --> move cp --> copy !! 执行最近的一次命令 echo $USER 展现当前用户名字 echo $PATH 展…

Linux:安装tomcat

注意:1.安装tomcat时最好用非root用户安装 2.可以选择新建一个用户,用户安装部署tomcat,本文将继续用fovace账户进行tomcat安装 一、前置条件 安装tomcat需要先安装jdk,所以先确定系统中是否已经有jdk,如下&#xff1a…

Docker的run流程

底层原理 Docker怎么工作? Docker为什么比VM虚拟机块? 1.Docker有比虚拟机更少的抽象层 2.docker利用的是宿主机的内核,vm需要是Guest OS 所以说,新建一个容器的时候,docker不需要像虚拟机一样加载一个系统内核&am…

消息中间件中常见问题

如何保证消息不丢失 MQ的用途 异步发送(验证码,短信,邮件)MySQL,ES,Redis之间的数据同步分布式事务削峰填谷 消息可能丢失的环境 消息在产生端时候生产端挂掉,消息未到达交换机&#xff0c…

VS里拉取时候,变成变基中,变成分离分支状态,git 头指针分离于 baf67ff

分离头指针(detached HEAD) 通常,我们工作在某一个分支上,比如 master 分支。这个时候 master 指针和 HEAD 指针是一起前进的,每做一次提交,这两个指针就会一起向前挪一步。但是在某种情况下(例…

Revit中怎么画阶梯式旋转楼梯及生成桩

一、Revit中如何绘制阶梯式旋转楼梯 在楼梯的绘制过程中,如果采用(草图)楼梯的绘制方式,是没有办法将绘制的楼梯设置为阶梯式楼梯的,那么接下来我将采用构件的方式绘制阶梯式楼梯。 我们首先来看看阶梯式旋转楼梯和普通的旋转楼梯的区别&…

【C++】一些关于visual stdio,vscode,Mingw的思考 |bug

文章目录 今天在做YOLOV8的C部署时遇到的一些问题: 在进行一系列的操作之后会生成解决方案文件sln: 当然按道理到这一步之后,应该使用make命令进行下一步操作(但是我确实不会make命令,所以准备进sln来生成解决方案)&…

(0018) H5-VS Code保存后自动格式化Vue代码

安装插件Vetur 配置自动格式化,具体路径【文件】-【首选项】-【设置】,打开设置(json) 将以下内容复制到settings.json {// vscode默认启用了根据文件类型自动设置tabsize的选项"editor.detectIndentation": fals…

最新导则下生态环评报告编制技术暨报告篇、制图篇、指数篇、综合应用篇教程

详情点击链接:最新导则下生态环评报告编制技术暨报告篇、制图篇、指数篇、综合应用篇 一,生态环评报告编制规范 结合生态环境影响评价最新导则,详述不同类型项目生态环评报告编制要求与规范 二,土地利用图 1、土地利用分类体系…

免费可用的GPU

这里介绍两个可以免费使用GPU的地方。 百度飞桨AI Studio 百度飞桨AI Studio提供的BML Codelab环境可以免费使用GPU。并且百度飞桨AI Studio中也开源了很多项目。只需要运行感兴趣的项目就会自动将该项目fork到自己的项目列表中。后面可在个人中心“我的项目”中查看。每天运…

Flink CDC 2.4 正式发布,新增 Vitess 数据源,更多连接器支持增量快照,升级 Debezium 版本

Flink CDC 2.4 正式发布,新增 Vitess 数据源,更多连接器支持增量快照,升级 Debezium 版本 1. Flink CDC 简介2. Flink CDC 2.4 概览3. 详解核心特性和重要改进3.1 深入解读3.2 其他改进 4. 未来规划 1. Flink CDC 简介 Flink CDC [1] 是基于…