设计数据库中常见的规范

news2024/11/15 19:27:58

文章目录

  • 命名规范
  • 合适的字段类型
  • 主键设计要合理
  • 合适的字段长度
  • 优先考虑逻辑删除,而不是物理删除
  • 每个表都需要添加一些通用字段
  • 表的字段不要太多
  • 尽可能使用not null 定义字段
  • 评估哪块要加索引
  • 避免使用MySQL保留字
  • 不要外键关联,一般用代码维护
  • 一般都选择INNODB存储引擎
  • 选择合适的字符集
  • 如果数据库字段是枚举,就在comment注释清楚
  • 时间类型的选择
  • 不建议使用存储过程,触发器
  • 1:N关系的设计
  • 大字段
  • 分库分表

命名规范

数据库表名,字段名,索引名等都要命名规范,可读性高

  • 表名,字段名必须使用小写字母或者数字,禁止使用数字开头,禁止使用拼音,一般还不使用英文缩写
  • 主键索引名为pk_字段名,唯一索引名为uk_字段名,普通索引名为idx_字段名

合适的字段类型

设计表时候,要选择合适的字段类型

  • 尽可能的选择存储空间小的字段类型,比如数字类型:从tinyint, smallint,int,bigint开始选择

  • 小数类型如金额,则使用decimal,禁止使用float和double

  • 如果存储的字符串长度几乎相等,使用char定长字符串类型

  • archar是可变长字符串,不预先分配空间,长度不要超过500

  • 如果存储的值太大,建议字段类型修改为text,同时抽出单独一张表,用主键与之对应

  • 同一表中,所有varchar字段的长度加起来,不能大于65535,如果又这样的需求,请使用text/longtext类型

主键设计要合理

主键的设计最好不要与业务逻辑有所关联,主键最后是一串毫无意义,独立不重复的数字,比如:UUID,Auto_increment,又或者是雪花算法生成的主键等等

合适的字段长度

在MySQL中, varchar 和 char 类型表示字符长度,而其他类型表示的长度都表示字节长度。比如 char(10) 表示字符长度是10,而 bigint (4) 表示显示长度是 4 个字节但是因为bigint实际长度是 8 个字节,所以bigint (4) 的实际长度就是8个字节。

我们在设计表的时候,需要充分考虑一个字段的长度,比如一个用户名字段(它的长度5~20个字符) ,你觉得应该设置多长呢? 可以考虑设置为 username varchar (32) 。:字段长度一般设置为2的幂哈(也就是 2的n 次方)

优先考虑逻辑删除,而不是物理删除

  • 物理删除:把数据从硬盘删除,可释存储空间
  • 逻辑删除:给数据添加一个字段,is_deleted,以标记数据已经逻辑删除了
# 物理删除
delete from account_info_tab where account_no = '11';


# 逻辑删除
update account_info_tab set is_deleted = 1 where account_no = '11';

Why?

  • 恢复数据困难
  • 物理删除会使自增的主键不再连续
  • 核心业务表不建议做物理删除,只适合做状态变更

每个表都需要添加一些通用字段

  • id:主键,必须
  • creat_time:创建时间,必须
  • update_time:修改时间,必须
  • version:数据记录的版本号,用于乐观锁,非必须
  • remark:数据记录备注,非必须
  • modified_by:修改人,非必须
  • creator:创建人,非必须

表的字段不要太多

一张表的字段不要太多,一般尽量不要超过20个字段

Why?

如果一张表的字段过多,表中保存的数据可能就会很大,查询效率就会低

当表的字段数很多时,可以将表分为俩张表,一张作为条件查询表,一张作为详细内容

尽可能使用not null 定义字段

如果没有特殊的理由,一般都建议将字段定义为 NOT NULL

why?

  • 首先,NOT NULL 可以防止出现空指针问题
  • 其次, NULL 值存储也需要额外的空间的,它也会导致比较运算更为复杂,使优化器难以优化SQL。
  • NULL 值有可能会导致索引失效
  • 如果将字段默认设置成一个空字符串或常量值并没有什么不同,且都不会影响到应用逻辑,那就可以将这个字段设置为 NOT NULL

评估哪块要加索引

首先,评估表的数据量,如果数据量只有几十行,就没必要加索引。否则设计表的时候,如果有查询条件的字段,一般就要加索引

索引使用的注意事项:

  • 索引不要建的太多,一般单索引个数不要超过5个
  • 去分度不高的字段,不能加索引,如:性别
  • 索引建立完成后,还是要避免索引失效的情况
  • 索引过多的话,可以通过联合索引的方式来优化,然后的话,索引还有一些规则,如覆盖索引,最左匹配原则等等

避免使用MySQL保留字

如果有MySQL的保留着,可能会使得SQL语句编写,SHELL脚本中变量的转义变得非常复杂

不要外键关联,一般用代码维护

这个在阿里的java规范也有提到:

【强制】不得使用外键与级联,一切外键概念必须在业务层解决

  • 使用外键存在性能问题、并发死问题、使用起来不方使等等。每次做 DELETE 或者 UPDATE 都必须考虑外键约束,会导致开发的时候很难受,测试数据造数据也不方便。
  • 还有一个场景不能使用外键,就是分库分表。

一般都选择INNODB存储引擎

image-20221222122102243

选择合适的字符集

一般中英文环境使用utf8mb4

  • utf8:支持中英文混合,国际通用,3个字节长度
  • utf8mb4:完全兼容utf8,4个字节长度,一般存储emoji表情要用到
  • GBK:支持中文,但不支持国际通用字符集,2个字节长度
  • latin1:MySQL默认字符集,1个字节长度

如果数据库字段是枚举,就在comment注释清楚

时间类型的选择

  • date:表示日期值
  • time:表示时间值
  • datetime:表示日期时间值,跟时区无关
  • timestamp:表示时间戳值,跟时区有关
  • year:年份值

推荐使用datetime来保存日期和时间,存储范围更大,且和时区无关

不建议使用存储过程,触发器

存储过程:已预编译为一个可执行过程的一个或多个sql语句

触发器:指一段代码,当触发某个事件的时候,自动执行这些代码

原因:对于MYSQL来说,这俩个东西不是很成熟

1:N关系的设计

img

有时候俩张表存在N:N关系时候,我们应该消除这种关系,通过增加第三张表,把N:N修改为俩个1:N

大字段

当碰到很大的数据的时候,不建议直接把表字段设计为text类型,可以保存到mongodb中,然后,在业务表保存对应的mongodb的id即可

分库分表

  • 分表:就是一个数据库分为多个表

image-20221222141251783

原因:数据量太大的话,SQL的查询就会变慢。

又或者是把商品需要频繁增删改查的数据和基本不怎么用的数据给分离开来。

image-20221222143227846

参考视频:21个MySQL表设计的经验准则

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

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

相关文章

外包四年太差劲,幡然醒悟要跳槽

前几天有个读者过来说,“二哥,外包干了四年,感觉和外界差距有点大,现在被动醒悟,希望你能帮我制定一下学习路线。” 那二哥这么负责任,必须得承担起这份职责啊!于是我就让读者整理了一份 1.0 版…

RL - 简单介绍

目录 一、两种机器学习类型 1.1 预测型机器学习 1.2 决策型机器学习 二、强化学习的定义 三、强化学习的交互过程 四、强化学习系统要素 五、强化学习智能体分类 一、两种机器学习类型 1.1 预测型机器学习 1有监督学习: 基于数据的一部分输入,去预测相关输…

STL之stack、queue、priority_queue模拟实现

容器适配器 容器适配器&#xff0c;简言之是可以用不同容器来快速实现自己的工具。像stack、queue、priority_queue都是容器适配器。 stack模拟实现 主要接口定义如下&#xff1a; namespace lz {template<class T, class Container deque<T>>class stack{publ…

【论文阅读总结】inception v2_v3总结

重新思考计算机视觉的Inception架构1.摘要2.简介2.1 以往模型问题2.2 问题缓解2.3 问题解决出现的问题2.4 有效的一般原则和优化思想3.一般设计原则3.1 设计原则1【避免代表性瓶颈(不能过度降维)】3.2 设计原则2【特征越多&#xff0c;收敛越快】3.3 设计原则3【卷积之前使用1*…

【java】opencv + Tesseract(tess4j) 实现图片处理验证码识别

1.opencv for java 环境搭建和测试 到OpenCV官网下载你需要的版本&#xff0c;运行安装&#xff0c;记住安装目录。打开上一步安装的位置&#xff0c;依次打开如下图位置&#xff0c;复制opencv-{version}.jar、x64包下对应的dll到项目里&#xff0c;放在同级 在maven里添加o…

JVS低代码首页功能介绍

首页介绍 首页操作演示 系统logo 系统logo是每个系统的名称标识&#xff0c;点击系统logo可以返回到首页&#xff0c;这里的系统logo是支持配置化的。 应用快捷导航 应用快捷导航是将登录用户有权限使用的应用展示出来&#xff0c;鼠标点击后&#xff0c;系统展示可见的应用于…

k8s-Pod的生命周期和调度

目录 主要运行周期 1 Pod创建和终止 2 初始化容器 3 钩子函数 4 容器探测 5 重启策略 Pod调度 1 定向调度 2 亲和性调度 3 污点和容忍 主要运行周期 我们一般将pod对象从创建至终的这段时间范围称为pod的生命周期&#xff0c;它主要包含下面的过程&#xff1a; pod创…

vscode python远程开发最佳实践

文章目录环境插件踩坑python类型提示不起作用配置PYTHONPATH前言 最近因为remote-ssh从pycharm转到vscode开发, 再删掉pycharm强制使用vscode摸索了一周熟练之后发现vscode其实使用起来也很爽&#xff0c;一些踩坑和最佳实践方案汇总 环境 插件 remote-sshpythonpylance(微软…

Compose 动画艺术探索之 Easing

本篇文章是此专栏的第六篇文章&#xff0c;前几篇文章大概将 Compose 中的动画都简单过了一遍&#xff0c;如果想阅读前几篇文章的话可以点击下方链接&#xff1a; Compose 动画艺术探索之瞅下 Compose 的动画Compose 动画艺术探索之可见性动画Compose 动画艺术探索之属性动画…

Mobtech 秒验应用介绍

一、传统APP手机注册登录验证的弊端 1、 注册过程输入的信息过多&#xff0c;耗费时间长。用户体验感较差。 2、 传统手机绑定需要通过验证码验证手机真实性&#xff0c;容易被批量注册。 3、 如果手机APP多&#xff0c;每个APP都注册&#xff0c;使用的用户名密码多&#x…

高薪资的IT行业,我们该不该转行

今年互联网各大厂秋招基本结束&#xff0c;校招薪资已经出炉了。可以从上图中看到&#xff0c;今年薪资仍然存在倒挂&#xff08;新员工工资高过老员工&#xff09;现象。各大厂人均 30w 的薪资在其它专业是难以想象的。大家无需置疑上述薪资的可靠性。作为今年的校招生&#x…

视频剪辑教程,批量将视频裁切为1:1比例的尺寸

视频太多&#xff0c;如何批量剪辑&#xff0c;比如将视频裁切为1:1的比例呢&#xff1f;那么今天小编给大家带来一个超简单的方法&#xff0c;可以同时将多段16:9的视频裁切为1:1的视频。 所需工具 多段16:9&#xff08;即1280*720&#xff09;的视频素材 操作步骤 第一步&…

C++那些事之高效率开发

1.神器 目前开发C/C用的比较多的当属Vim、VS code、CLion。 Vim配上插件编写C/C效率高的不少。 VSCode配上自定义配置及快捷键、vim插件效率跟vim旗鼓相当。 CLion因其独特的CMakeLists.txt管理方式及强大的代码补全等功能&#xff0c;编写本地代码绝对好于前两者。 但是对…

获B轮融资 官栈如何打破薛定谔式“中式滋补”

日前&#xff0c;滋补头部品牌官栈宣布完成B轮融资&#xff0c;这是其继去年9月完成Pre-B轮融资后&#xff0c;再度获得资本青睐。 近年来&#xff0c;乘国潮东风&#xff0c;中式滋补在沉寂多年后火热翻红&#xff0c;以官栈为代表的新品牌快速崛起&#xff0c;而老字号也紧跟…

非零基础自学Golang 第15章 Go命令行工具 15.5 代码测试(test) 15.5.2 基准测试 15.5.3 覆盖率测试

非零基础自学Golang 文章目录非零基础自学Golang第15章 Go命令行工具15.5 代码测试(test)15.5.2 基准测试15.5.3 覆盖率测试第15章 Go命令行工具 15.5 代码测试(test) 15.5.2 基准测试 基准测试提供可自定义的计时器和一套基准测试算法&#xff0c;能方便快速地分析一段代码…

P5 PyTorch 常用数学运算

前言&#xff1a; 这里主要介绍一下PyTorch 的常用数学运算 目录&#xff1a; 1&#xff1a; add|sub 加减法 2: mul/div 乘/除运算 3: 矩阵乘法 4 2D矩阵转置 5 其它常用数学运算 6 clamp 梯度剪裁 一 加减法 1.1 加法 可以直接通过符号 或者 torch.add # -*- co…

并发编程学习(五):设计模式~同步模式之保护性暂停

1、保护性暂停 模式的定义 保护性暂停 即Guarded Suspension&#xff0c;用于在一个线程等待另一个线程的执行结果。 要点&#xff1a; 有一个结果需要从一个线程传递到另一个线程&#xff0c;让它们关联同一个对象GuardedObject。如果有结果不断从一个线程到另一个线程&…

Redis架构演变之主从、Sentinel哨兵、Cluster(通信、分片、路由等机制)

一. 主从复制 1. 含义 在分布式系统中&#xff0c;为了解决单点问题&#xff0c;通常会把数据复制多个副本到其它机器&#xff0c;满足故障恢复和负载均衡等要求&#xff0c;Redis也是如此&#xff0c;提供了主从复制功能。&#xff08;redis第一代架构&#xff09; 实质&…

程序员35岁就失业了吗?就没有其他路可以选了吗?

前言 回到老家最近感到很迷茫&#xff0c;不知道该做什么&#xff0c;也不知道学习了更多的技术又能干什么。 有句话确实是很符合我现在的处境&#xff1a;时势造英雄&#xff01;虽然我不是英雄&#xff0c;但是我确实需要一个鞥一展所长的环境。 记得当初决定回到哈尔滨&a…

【大话设计模式】工厂+策略+装饰模式 hw01

背景 小李已经是一个工作一年的初级工程师了&#xff0c;他所在的公司是一家大型购物商场。随着各种网络购物软件兴起&#xff0c;老板也想做一个商场的购物 APP。分给小李的是一个一个订单结算模块&#xff0c;需要支持各种不同的结算策略。 需求 请帮小李写一个订单结算模…