数据库设计-MySQL设计小册

2024-04-02 01:36

本文主要是介绍数据库设计-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项目比较有意思,规范写的还不错。项目几年不维护了,不过是开源项目,我没用过,不过看着挺有意思。

这篇关于数据库设计-MySQL设计小册的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/868638

相关文章

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

SQL中的外键约束

外键约束用于表示两张表中的指标连接关系。外键约束的作用主要有以下三点: 1.确保子表中的某个字段(外键)只能引用父表中的有效记录2.主表中的列被删除时,子表中的关联列也会被删除3.主表中的列更新时,子表中的关联元素也会被更新 子表中的元素指向主表 以下是一个外键约束的实例展示

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

如何去写一手好SQL

MySQL性能 最大数据量 抛开数据量和并发数,谈性能都是耍流氓。MySQL没有限制单表最大记录数,它取决于操作系统对文件大小的限制。 《阿里巴巴Java开发手册》提出单表行数超过500万行或者单表容量超过2GB,才推荐分库分表。性能由综合因素决定,抛开业务复杂度,影响程度依次是硬件配置、MySQL配置、数据表设计、索引优化。500万这个值仅供参考,并非铁律。 博主曾经操作过超过4亿行数据

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

MySQL数据库宕机,启动不起来,教你一招搞定!

作者介绍:老苏,10余年DBA工作运维经验,擅长Oracle、MySQL、PG、Mongodb数据库运维(如安装迁移,性能优化、故障应急处理等)公众号:老苏畅谈运维欢迎关注本人公众号,更多精彩与您分享。 MySQL数据库宕机,数据页损坏问题,启动不起来,该如何排查和解决,本文将为你说明具体的排查过程。 查看MySQL error日志 查看 MySQL error日志,排查哪个表(表空间

MySQL高性能优化规范

前言:      笔者最近上班途中突然想丰富下自己的数据库优化技能。于是在查阅了多篇文章后,总结出了这篇! 数据库命令规范 所有数据库对象名称必须使用小写字母并用下划线分割 所有数据库对象名称禁止使用mysql保留关键字(如果表名中包含关键字查询时,需要将其用单引号括起来) 数据库对象的命名要能做到见名识意,并且最后不要超过32个字符 临时库表必须以tmp_为前缀并以日期为后缀,备份

[MySQL表的增删改查-进阶]

🌈个人主页:努力学编程’ ⛅个人推荐: c语言从初阶到进阶 JavaEE详解 数据结构 ⚡学好数据结构,刷题刻不容缓:点击一起刷题 🌙心灵鸡汤:总有人要赢,为什么不能是我呢 💻💻💻数据库约束 🔭🔭🔭约束类型 not null: 指示某列不能存储 NULL 值unique: 保证某列的每行必须有唯一的值default: 规定没有给列赋值时的默认值.primary key:

怎么让1台电脑共享给7人同时流畅设计

在当今的创意设计与数字内容生产领域,图形工作站以其强大的计算能力、专业的图形处理能力和稳定的系统性能,成为了众多设计师、动画师、视频编辑师等创意工作者的必备工具。 设计团队面临资源有限,比如只有一台高性能电脑时,如何高效地让七人同时流畅地进行设计工作,便成为了一个亟待解决的问题。 一、硬件升级与配置 1.高性能处理器(CPU):选择多核、高线程的处理器,例如Intel的至强系列或AMD的Ry