【MySQL数据库开发设计规范】之表设计规范

news2024/11/24 9:11:42

欢迎点开这篇文章,自我介绍一下哈,本人姑苏老陈 ,是一名JAVA开发老兵。

本文收录于 《MySQL数据库开发设计规范》专栏中,该专栏主要分享一些关于MySQL数据库开发设计相关的技术规范文章,定期更新,欢迎关注,谢谢 :-)

文章目录

    • 一、前言
    • 二、表设计规范
    • 三、库数据规范
    • 四、总结

一、前言

在我们对数据库技术方案设计的时候,我们是否有自己的设计理念或者原则,还是更多的依据自己的直觉去设计,是否曾经懊悔线上发生过的一次低级故障,可能稍微注意点就可以避免,是否想过怎么才能很好的避免,规范的价值正是我们工作的检查清单,需要我们不断从错误中积累有效经验来指导未来的工作。

本文介绍MySQL数据库开发设计规范之数据库表设计规范以及库设计规范。

PS:以下规范在大型互联网公司经过了充分的验证,尤其适用于并发量大、数据量大的业务场景。

在这里插入图片描述

二、表设计规范

1.【推荐】建表规范示例;

CREATE TABLE `student_info` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
  `stu_name` varchar(10) NOT NULL DEFAULT '' COMMENT '姓名',
  `stu_score` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT '总分',
  `stu_num` int(11) NOT NULL COMMENT '学号',
  `stu_fee` decimal(8,2) DEFAULT '0.00' COMMENT '学费',
  `status` tinyint(4) DEFAULT '1' COMMENT '1代表记录有效,0代表记录无效',
  `create_time` datetime NOT NULL COMMENT '创建时间',
  `update_time` datetime NOT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_student_info_stu_num` (`stu_num`) USING BTREE,
  KEY `idx_student_info_stu_name` (`stu_name`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COMMENT='学生信息表;

说明:

A、表设计必须存在的三个字段分别是主键id、创建时间create_time、更新时间update_time;

B、关于日期时间字段,推荐使用datetime类型,其中datetime和timestamp都是用于表示日期和时间的数据类型,区别如下:

数据范围:
    datetime数据类型的有效范围是从1000年到9999年,精度为秒。
    timestamp数据类型的有效范围是从1970年到2038年,精度为秒。

存储空间:
    datetime数据类型需要8个字节的存储空间。
    timestamp数据类型需要4个字节的存储空间。

存储方式:
    datetime以固定的时区存储,不受时区设置的影响。
    timestamp以UTC时间(协调世界时)存储,并根据时区设置进行转换。

默认值和自动更新:
    datetime可以设置默认值和自动更新值,但不会记录变更的时间。
    timestamp可以设置默认值和自动更新值,并会记录变更的时间。

2.【强制】禁止使用外键,如果有外键完整性约束,需要应用程序控制;

说明:当使用了外键后,每次级联delete或update的时候,都要级联操作相关的外键表,不论有没有这个必要,由其在高并发的场景下,这会导致性能瓶颈,增加数据库压力,所以,不建议使用数据库的外键约束;

3.【强制】每个Innodb 表必须有一个主键id;
说明:Innodb 是一种索引组织表,其数据存储的逻辑顺序和索引的顺序是相同的。每张表可以有多个索引,但表的存储顺序只能有一种,Innodb 是按照主键索引的顺序来组织表的,因此不要使用更新频繁的列如UUID、MD5、HASH和字符串列作为主键,这些列无法保证数据的顺序增长,主键建议使用自增ID 值。

4.【推荐】单表列数目最好小于50;

说明:如果单表中列数目过多,对数据库性能影响比较大,而且也不利于管理。

5.【强制】禁止使用分区表;
说明:分区表在物理上表现为多个文件,在逻辑上表现为一个表,谨慎选择分区键,跨分区查询效率可能更低,建议采用物理分表的方式管理大数据;

6.【推荐】拆分大字段和访问频率低的字段,分离冷热数据;

说明:拆分大字段和访问频率低的字段,分离冷热数据,有利于有效利用缓存,防止读入无用的冷数据,减少磁盘IO操作。

7.【推荐】采用合适的分库分表策略,例如千库十表、十库百表等(建议表大小控制在2G),即大表分库、长表拆表;

说明:如果软件项目前期数据量不大,慎重进行分库分表设计,会带来很多麻烦问题,比如分页查询、跨库查询、分布式事务等等,严重影响开发效率。

一般当单表数据量超过500W或者2G的情况下,读写性能会变差一些。此时,如果常规的优化手段已经不起作用,比如:SQL调优、添加索引、主从复制、读写分离,这时候可以考虑一下进行分库分表。

8.【推荐】单表不超过50个int字段;不超过20个char字段,不超过2个text字段;

9.【推荐】日志类型的表可以考虑按创建时间水平切割,定期归档历史数据;

10.【强制】禁止使用order by rand()随机排序函数;
说明:order by rand()会为表增加一个伪列,然后用rand()函数为每一行数据计算出rand()值,基于该行排序,这通常都会生成磁盘上的临时表,因此效率非常低。

11.【参考】可以结合使用hash、range、lookup table进行散表;

12.【推荐】每张表数据量建议控制在500w以下,超过500w可以使用历史数据归档或分库分表来实现;

说明:500万行并不是MySQL数据库的限制。过大对于修改表结构,备份,恢复都会有很大问题。MySQL没有对存储有限制,取决于存储设置和文件系统;

13.【强制】禁止在表中建立预留字段;
说明:预留字段的命名很难做到见名识义,预留字段无法确认存储的数据类型,所以无法选择合适的类型;对预留字段类型的修改,会对表进行锁定;

三、库数据规范

1.【推荐】数据库使用InnoDB存储引擎;
说明:支持事务、行级锁、并发性能更好、CPU及内存缓存页优化使得资源利用率更高;

2.【推荐】数据库和表的字符集统一使用UTF8;
说明:utf8号称万国码,其无需转码、无乱码风险且节省空间。若是有字段需要存储emoji表情之类的,则将表或字段设置成utf8mb4,utf8mb4向下兼容utf8。

3.【推荐】不同业务,使用不同的数据库,避免互相影响;

说明:如果是大型软件项目,推荐不同业务,使用不同的数据库;如果是中小型软件项目,不建议这样做,这样会增加代码的复杂度,降低开发效率,增加项目成本;

4.【强制】所有线上业务库均必须搭建MHA高可用架构,避免单点问题。

说明:如果是购买云数据库,可以选择高可用版本的;

四、总结

以上介绍了在进行MySQL数据库表设计时,可以遵循的一些技术规范。希望对大家有帮助,谢谢 :-)

附本文参考资料:

  • 阿里云官方知乎:https://www.zhihu.com/org/a-li-yun-97-77
  • 阿里云开发者官方社区:https://developer.aliyun.com/
  • 阿里开发者官方CSDN社区:https://blog.csdn.net/alitech2017?type=blog
  • 阿里云云栖号CSDN:https://blog.csdn.net/yunqiinsight/category_10231626.html
  • 阿里巴巴技术团队发布的《JAVA开发手册》泰山版
  • 阿里云开发者官方微信公众号

如果您对文章中内容有疑问,欢迎在评论区进行留言,我会尽量抽时间给您回复。如果文章对您有帮助,欢迎点赞、收藏。您的点赞,是对我最大的支持和鼓励,谢谢 :-)

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

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

相关文章

Java反射(含静态代理模式、动态代理模式、类加载器以及JavaBean相关内容)

目录 1、什么是反射 2、Class类 3、通过Class类取得类信息/调用属性或方法 4、静态代理和动态代理 5.类加载器原理分析 6、JavaBean 1、什么是反射 Java反射机制的核心是在程序运行时动态加载类并获取类的详细信息,从而操作类或对象的属性和方法。本质是JVM得…

【计算机毕业设计】基于微信小程序文章管理系统

随着 计算机技术的成熟,互联网的建立,如今,PC平台上有许多关于文章管理方面的应用程序,但由于使用时间和地点上的限制,用户在使用上存在着种种不方便,而开发一款基于微信小程序的文章管理系统,能…

基于机器学习的网络流量识别分类(完整资源收米)NetFlow-Sentry

项目介绍 这是一个名为NetFlow-Sentry的项目,项目实现了对网络流量的实时检测,特征抓取,内置了基于Pytorch的深度学习模型来进行流量分类。该项目除可以进行实时特征提取,还提供了网络流量数据的输入口,可以直接识别分…

并发——进程

1. 程序 程序(program)是什么? 计算机程序(computer program)一般是指以某些程序设计语言编程,能够运行于某种目标体系结构上 程序 数据结构 算法 数据结构:用来表示人们思维对象的抽…

mysql的存储结构

一个表就是一个ibd文件 .ibd文件大小取决于数据和索引,在5.7之后才会为每个表生成一个独立表空间即一个ibd文件,在此之前,所有表默认下都会存储在“系统表空间”(共享表空间),所有表都在一个ibd文件。 inn…

我的全新官网

科技语者-探索未来的语言和沟通 (chgskj.cn) 另外我还开放了一个网站科技语者-介绍页 (null.fit)

Verilog复习(四)| 组合逻辑

一位全加器结构描述: 数据流描述: 行为描述: 只要有事件发生(列表中任何 信号有变化),就执行begin…end 的语句 。 always的事件控制方式 边沿触发 always (posedge clk) // clk从低电平->高&#x…

使用Flask构建POST请求的Web应用

文章目录 准备工作创建路由处理POST请求创建表单页面运行应用结论 在Web开发中,处理POST请求是一项常见任务,特别是在构建表单提交、用户注册和数据提交等功能时。Flask是一个简单而强大的Python Web框架,它提供了方便的工具来处理HTTP请求&a…

答辩PPT自述稿如何与幻灯片同步?笔灵AI一键生成功能解析

在我原本的认知里面,答辩PPT是要包含论文各个章节的,在答辩时需要方方面面都讲到的,什么摘要、文献综述、实证分析、研究结果样样不落。但是,这大错特错! 答辩PPT环节时长一般不超过5分钟,老师想要的答辩P…

Postman工具介绍与安装

一、Postman介绍 Postman 乃是一款对 HTTP 协议予以支持的接口调试及测试工具,其突出特性在于功能强大,并且使用简便、易用性良好。不管是开发人员开展接口调试工作,还是测试人员进行接口测试任务,Postman 均属于首选工具之一。 接…

面试八股之Redis篇2——redis分布式锁

🌈hello,你好鸭,我是Ethan,一名不断学习的码农,很高兴你能来阅读。 ✔️目前博客主要更新Java系列、项目案例、计算机必学四件套等。 🏃人生之义,在于追求,不在成败,勤通…

图书馆APP开发解决方案

uni-app框架:使用Vue.js开发跨平台应用的前端框架,编写一套代码,可编译到Android、小程序等平台。 框架支持:springboot/Ssm/thinkphp/django/flask/express均支持 前端开发:vue.js 可选语言:pythonjavanode.jsphp均支持 运行软件…

blender 为世界环境添加纹理图像

1、打开世界环境配置项 2、点击颜色右侧的黄色小圆,选择环境纹理 3、打开一张天空图像 4、可以通过调整强度/力度,调整世界环境的亮度

ambari-server高可用配置方案

制品 https://kdocs.cn/l/cie4hSgvUunX 前置条件 环境需要支持VRRP协议 环境需要配置好yum源 变更影响面 变更不会影响其他组件 配置lb(需要客户侧配置并提供LB地址) 转发方式选择 主备 监听端口为8080、8440、8441 协议为tcp 后端监听选择kde-offline1为主 后端监听选择kde-…

QT-小项目:连接MY SQL数据库实现登录(下一章实现登录注册账号和忘记密码功能)

一、环境准备 1、下载MYSQL 64位,安装完成,制作简易数据库教程如下: MY SQL安装 2、QT 编译器使用 二、实现工程目录(基于上一章基础上) 三、源程序增加内容如下: login.cpp 增加头文件: #in…

MES系统与WMS集成方法(满分100学习资料)

导语 大家好,我是智能仓储物流技术研习社的社长,老K。专注分享智能仓储物流技术、智能制造等内容。 新书《智能物流系统构成与技术实践》 完整版文件和更多学习资料,请球友到知识星球【智能仓储物流技术研习社】自行下载 这份文件是关于MES系…

头歌C语言数据结构(队列的应用)

第1关:循环队列 任务描述 本关任务:编写一个循环队列,实现入队、出队操作,判断队空、队满等特殊情况。 相关知识 为了完成本关任务,你需要掌握:1.循环队列定义,2.入队、出队的定义&#xff…

别的项目都有 awesome 仓库,RT-Thread 也要有!

awesome 仓库是 GitHub 上用于收集某个项目或者某个语言相关的优质内容的仓库,例如中间件、新闻资讯、网站等。 作为 RT-Thread 开发者,看到别的项目都有 awesome 仓库,我想 RT-Thread 也应该有! 于是,我创建一个 aw…

pyqt5将ui文件转为python文件

在pyqt5中使用 pyuic将ui文件转为py文件: 例如:将home.ui文件转为vio_detect.py文件,所需命令如下: pyuic5 -x home.ui -o vio_detect.py

Python彻底解决TypeError的问题

今天看到一个问题: TypeError: int() argument must be a string, a bytes-like object or a number, not list 代码是这样的: id int(os.path.split(imagePath)[1].split(.)[0]) 其实这个提示已经非常明显了,百度翻译过来就是&#xff1a…