数据库设计-MySQL设计小册

前言

最近回顾了下MySQL相关的知识,比如索引、几大日志、事务、MVCC、SQL执行流程、Buffer Pool等等。理论知识看了一大堆,自然还是需要实践的,第一个反应就是数据库设计规范。项目开发中,数据库设计自然是重要的一环,但是目前大多都忽略了成了一个不那么重要的环节,但往往是设计阶段留下的坑,开发阶段来填。没有统一的规范,大多数开发人员都是按照之前的数据库设计进行惯性开发,不犯错就是最大的正确。我搜了下相关文章,发现还是有不少好文章,说的很清楚,让我一瞬间放下再写一篇文章的念头,但是我发现这些文章普遍阅读量不高,那就让我的这篇文章作为引子,给大家学习数据库设计规范提供一个好的平台。

表设计

重点规范

【强制】表达是与否概念的字段,必须使用 is_xxx 的方式命名,数据类型是 unsigned tinyint (1 表示是,0 表示否)。
:::info
注意:POJO 类中的任何布尔类型的变量,都不要加 is 前缀,所以,需要在设置从 is_xxx 到 Xxx 的映射关系。数据库表示是与否的值,使用 tinyint 类型,坚持 is_xxx 的命名方式是为了明确其取值含 义与取值范围。
正例:表达逻辑删除的字段名 is_deleted,1 表示删除,0 表示未删除。
补充:切记建表字段长度不要选1,不然mybatis-plus会自动转换成布尔值
:::
【强制】表名、字段名必须使用小写字母或数字,禁止出现数字开头,禁止两个下划线中间只 出现数字。数据库字段名的修改代价很大,因为无法进行预发布,所以字段名称需要慎重考虑。
:::info
说明:MySQL 在 Windows 下不区分大小写,但在 Linux 下默认是区分大小写。因此,数据库名、表名、 字段名,都不允许出现任何大写字母,避免节外生枝。
正例:aliyun_admin,rdc_config,level3_name
反例:AliyunAdmin,rdcConfig,level_3_name
:::
【强制】表必备三字段:id, create_time, update_time。
:::info
说明:其中 id 必为主键,类型为 bigint unsigned、单表时自增、步长为 1。create_time, update_time 的类型均为 datetime 类型,前者现在时表示主动式创建,后者过去分词表示被动式更新。
:::
【推荐】字段允许适当冗余,以提高查询性能,但必须考虑数据一致。冗余字段应遵循:
:::info
不是频繁修改的字段。
不是唯一索引的字段。
不是 varchar 超长字段,更不能是 text 字段。
正例:各业务线经常冗余存储商品名称,避免查询时需要调用 IC 服务获取。
:::

规范汇总

  1. 表字段、索引名、表名等都要见名知意选择合适的字段类型—最基本的一步了,不要省事让别人看不懂。字段类型根据业务来定,允许范围内越精简越好
  2. 主键推荐自增,选择bigint即可,自增主键性能很好,非分库分表设计首选
  3. 除了上面的固定三字段,一般会有逻辑删除字段is_deleted,创建人修改人。
  4. 业务允许的情况下尽量别用null做默认值–坏处一大把,问题是大家都懒得设置,哈哈
  5. 单表字段不宜过多,做好冷热字段分离,比如列表就属于热数据,具体数据需要点进去详情页看,这些字段就属于冷数据,这两部分就可以分开建表,用一个base_id关联
  6. 时间字段推荐使用datetime,范围大。timestamp就到2038年…

简要总结

我个人在设计表的时候是推荐尽量将表设计成独立的,可以单表查询,为此可以增加冗余字段,表与表之间通过字段关联。凡是写了很冗长的SQL,说明要么是业务实在是复杂,要么就是当初表设计考虑不足,或者压根是叠shi山,来一坨垒一坨。上面的重要规范是摘抄的阿里开发手册的一些我觉得非常重要的部分,全文我放在了好文推荐一栏,值得大家一看。
MySQL本身不易扩展,并且相对娇弱,所以设计思路一定要把复杂的动作放在应用程序去处理,避免MySQL做过重的逻辑操作,做好存储和简单的查询即可,尽量不要让MySQL成为性能瓶颈。应用程序可以从以下三个方面给MySQL减负:

  1. 减少函数的使用,例如数据转换之类的交由应用程序处理,同时也避免了索引可能不生效的情况。
  2. 外键肯定不能用了,要增加冗余字段,在应用程序侧去做主动关联,例如主表和扩展表通过一个base_id字段去关联
  3. 拆分大SQL,应用程序来做数据关联,应用侧缓存、多线程用上一般不会比MySQL慢

索引设计

重点规范

  1. 索引列建议
    1. 出现在 SELECT 、 UPDATE 、 DELETE 语句的 WHERE 从句中的列
    2. 包含在 ORDER BY 、 GROUP BY 、 DISTINCT 中的字段
    3. 多表 JOIN 的关联列

注意: 并不要将符合 1 和 2 中的字段的列都建立一个索引,通常将 1 、 2 中的字段建立联合索引效果更好

  1. 如何选择联合索引列的顺序
    1. 区分度最高的放在联合索引的最左侧(区分度 = 列中不同值的数量 / 列的总行数);
    2. 尽量把字段长度小的列放在联合索引的最左侧(因为字段长度越小,一页能存储的数据量越大, IO 性能也就越好);
    3. 使用最频繁的列放到联合索引的左侧(这样可较少的建立一些索引)。

规范汇总

  1. 索引不要过多,5个左右即可–索引也是数据,并且增删改还会重建索引,影响数据库处理速度
  2. 优先建联合索引—覆盖索引、最左匹配多舒服,注意区分度高的放在左边

简要总结

索引这个我之前写从零开始的SQL修炼手册那块已经说的很清楚了。对于查询的提升是非常大的,特别是覆盖索引,优化救星。
建索引相当于必修课吧,对我们理解MySQL也是很有用的,相关的索引结构、优化特性、设计思路都很有参考价值。上一篇大数据查询接口我在构想解法的时候,第一时间就想到了类似索引这种目录检索的方法,包括ES也是相似的解法。所以了解索引,也是开阔我们的技术视野。

好文推荐

重点来了,以下几篇文章写的都太好了,理论这块还得多看看大佬们。还是老样子,文章提供链接,会配上我的读后感。
Java开发手册-嵩山版
阿里及社区一众大佬们合力写的规范,包含很多维度的开发建议,绝对是Java的必读手册。数据库是其中一部分,写的很好,建议都很中肯,但是限于篇幅限制吧,还是有很多地方没有涉及,适合有一点数据库基础的读者们观看。所有建议均有正例反例,绝了,朋友们,上车了,本次列车是宝宝巴士。
MySQL数据库设计开发规范(汇总篇)
这一篇属实太全了,本来我想写个汇总,结果一看这篇直接给我干碎,面面俱到,给我整不会了。初学者一定要看,绝对是养成好习惯的基石,配合上面阿里小册,观感更佳。
archer-MySQL数据库设计规范
推荐这个主要是连带着这个GitHub项目比较有意思,规范写的还不错。项目几年不维护了,不过是开源项目,我没用过,不过看着挺有意思。

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

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

相关文章

dotcpp题目 1020: [编程入门]猴子吃桃的问题

一、题目 题目描述 猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。 第二天早上又将剩下的桃子吃掉一半,又多吃一个。以后每天早上都吃了前一天剩下的一半零一个。 到第N天早上想再吃时&#xff0c…

关于loop( ) 阻塞和非阻塞探究

一、SIR的补充 在上几篇博客中,有朋友私信问我,在ticker函数程序和中断服务程序(ISR)中写 物联网请求报错。怎么回事,在此解释。控制台如下 1.1解释 在使用 Ticker 函数和中断服务程序(ISR)时…

ARM IHI0069F GIC architecture specification (6)

2.3 亲和路由 亲和路由是一种基于分层地址的方案,用于识别中断路由的特定PE节点。 对于 PE,AArch64 状态的亲和性值在 MPIDR_EL1 中定义,AArch32 状态的亲和性值在 MPIDR 中定义: • 关联路由是一个由四个8 位关联字段组成的32 位…

问题解决:gorm查询oracle库表,返回struct字段数据为空的问题

package model// 表对应的struct // github.com/cengsin/oracle v1.0.0 // gorm.io/gorm v1.21.16 // 注意:column:USERNAME字段必须大写(oracle表中字段名大写),否则查询出的struct字段值会为空 type BBUser struct {Username …

开源简单方便功能强大的Devops工具:Goploy

Goploy:加速您的DevOps旅程,拥抱无缝部署——选择Goploy,让您从繁琐的发布与回滚中解放出来,尽享高效、智能与便捷的自动化部署力量! - 精选真开源,释放新价值。 概览 现在大部分流行的发布工具功能虽然强…

Leetcode-2810-故障键盘-c++

题目详见https://leetcode.cn/problems/faulty-keyboard/ 题解 这道题的关键是如何合理地使用STL,毕竟是一道简单题。 之前常用到的Vector容器是单向开口的连续内存空间 deque则是一种双向开口的连续线性空间,又称双端动态数组。所谓的双向开口&#x…

Mongodb字段更新操作符$currentDate

学习mongodb,体会mongodb的每一个使用细节,欢迎阅读威赞的文章。这是威赞发布的第54篇mongodb技术文章,欢迎浏览本专栏威赞发布的其他文章。 本文基于Mongodb的官方文档,整理了Mongodb字段更新操作符$currentDate的定义&#xff…

[数据结构]动态顺序表制作源码分享

顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存 储。在数组上完成数据的增删查改。 顺序表一般可以分为: 1. 静态顺序表:使用定长数组存储元素 2. 动态顺序表:使用动态开辟的数组存储。…

bugku-web-速度要快

发现phpsessid 从上述提示 提示发送post请求,并且带有参数margin 发送后发现报文头部有一个字段叫flag,但好像每一次flag都不一样 构建Python脚本 request requests.Session()data {margin:find, } for i in range(50):html request.post(urlhttp:/…

2024年04月在线IDE流行度最新排名

点击查看最新在线IDE流行度最新排名(每月更新) 2024年04月在线IDE流行度最新排名 TOP 在线IDE排名是通过分析在线ide名称在谷歌上被搜索的频率而创建的 在线IDE被搜索的次数越多,人们就会认为它越受欢迎。原始数据来自谷歌Trends 如果您相…

websocket多级nginx代理

在使用多层Nginx代理时,WebSocket的连接可能会遇到一些问题,因为WebSocket连接是持久化的,它需要Upgrade头部来确认升级到WebSocket协议。在多层代理的情况下,每层代理可能会修改或丢失这个Upgrade头部信息。 为了确保WebSocket能…

深度学习训练过程中,常见的关键参数和概念讲解

深度学习训练过程中的关键参数和概念对于构建、理解和优化模型至关重要。以下是一些最常见的参数和概念,以及它们的简要解释: 1. 学习率(Learning Rate) 学习率是优化算法中最重要的参数之一,它控制着权重调整的幅度…

如何借助Idea创建多模块的SpringBoot项目

目录 1.1、前言1.2、开发环境1.3、项目多模块结构1.4、新建父工程1.5、创建子模块1.6、编辑父工程的pom.xml文件 1.1、前言 springmvc项目,一般会把项目分成多个包:controler、service、dao、utl等,但是随着项目的复杂性提高,想复用其他一个模…

mkcert生成ssl证书+nginx部署局域网内的https服务访问问题

文章目录 mkcert生成ssl证书nginx部署局域网内的https服务访问问题1、下载mkcert查看自己的电脑是arm还是amd架构 2、安装mkcert3、测试mkcert是否安装成功4、查看CA证书存放位置5、打开windows的证书控制台6、生成自签证书,可供局域网内使用其他主机访问以下是nginx部署https服…

项目导出为jar遇到java.io.IOException: Problem reading font data

Maven项目导出为jar后运行测试,发现本地IDE可以运行的项目使用jar无法运行,出现 java.io.IOException: Problem reading font data网上搜索发现问题大都由于找不到对应的资源,经过最终调试问题解决,附代码: 【修改前…

阿里云效codeup如何执行github flow工作流

在阿里云效中执行 GitHub 工作流,实质上是在使用 Git 进行版本控制的过程中遵循 GitHub Flow 的原则。GitHub Flow 是一种简洁高效的工作流程,特别适用于追求快速迭代的团队。下面是在阿里云效中执行 GitHub 工作流的基本步骤: 1. 准备工作 …

交叉编译openssh

目录 交叉编译openssh网上资料很多,整理成了一个makefile文件,其中有一步发生错误,需要手动修改一下Makefile,还不能完全自动化编译. .PHONY:all prepare build cleanCROSS:arm-himix200-linuxCUR_DIR:$(shell pwd) OPENSSH_SRC_DIR:$(CUR_DIR)/openssh-9.7p1 OPENSSH_INSTALL_…

【ELK+Kafka+filebeat分布式日志收集】部署filebeat和Kibana(三)

filebeat下载 官网:https://www.elastic.co/cn/downloads/beats/filebeat 或者 cd /opt wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-8.8.1-linux-x86_64.tar.gz依次执行如下命令

idea Springboot 电影推荐系统LayUI框架开发协同过滤算法web结构java编程计算机网页

一、源码特点 springboot 电影推荐系统是一套完善的完整信息系统,结合mvc框架和LayUI框架完成本系统springboot dao bean 采用协同过滤算法进行推荐 ,对理解JSP java编程开发语言有帮助系统采用springboot框架(MVC模式开发)&…

书生·浦语大模型-第二节课笔记/作业

笔记 实验一 cli-demo import torch from transformers import AutoTokenizer, AutoModelForCausalLMmodel_name_or_path "../models"tokenizer AutoTokenizer.from_pretrained(model_name_or_path, trust_remote_codeTrue, device_mapcuda:0) model AutoModelF…