当前位置: 首页 > news >正文

设计MySQL数据表的几个注意点

最近合作搞项目,发现了很多问题。特别的,数据库层面上的问题更为致命。记录一下,希望后面看到博客的同学们注意。
注意:以下观点只用于一般情况下的单体、微服务,不保证适用所有场景。

一、ID问题

ID名称问题

如下图:有的同学喜欢,xx_id,这就很让人迷惑。因为,一般我们使用逻辑外键的时候才会这么写,而实际开发的时候,表的id,就固定为id字段,如图二。
在这里插入图片描述
在这里插入图片描述

ID自增长、映射类型

默认id自增长、映射为JAVA种的Integer

逻辑外键
  • 一张表的逻辑外键最好限制为一个,过多的逻辑外键,尽量额外建表维护。

二、字符

长度
  • 最好使用四种默认长度64、255、1024、2048,使用别的长度,要有明确的要求。
  • 超过2048麻烦额外建表。
适用范围
  • 尽量不要用字符存枚举、类型、状态、ID

三、时间

  • 不知道选的,默认选DATATIME
  • 语句-默认当前时间: DEFAULT CURRENT_TIMESTAMP
  • 语句-更新字段后更新时间:ON UPDATE CURRENT_TIMESTAMP
  • 没有必要,不要存时间戳

四、整型

  • 枚举字段使用默认:tinyint
  • 不知道的整型默认:int
  • 不要设定初始默认值,让应用去控制

五、字段

  • 超过2048字符长度的,尽量使用额外一张表
  • 如果有大字符、大内容需要存,使用文件服务。
  • 如果不想建文件服务,就存文件名,然后用本地文件系统。一定不要存文件到数据库。
  • 不要存模糊的字段,不要使用默认值(时间除外),因为后期会变成一个坑。
  • 不要设计备注、冗余字段,要改的表,让它改,冗余设计和bug一样恐怖

六、数据库的三大范式

如果谁设计的数据库不满足的,让它改!!!

不满足范式的设计,后期大概率要出问题。

七、关系

表间关系
  • 一对多、多对一的情况,可以使用逻辑外键
  • 多对多的情况,一定要建中间表,而且命名要有明显的辨识度例如:tm_user_role。tm就是中间表
  • 优先使用分组表,而不是分组字段。
行关系

设计二叉树行时,例如:每个行都有id、parent_id,其中parent_id是id的逻辑外键。

  • 保证数据总量的有穷性、最大值不会影响性能。
  • 可以的话,设计类似:00112233一样的字段作为code或字段level,进行快速识别。例如(第1-2、3-4、5-6行)、level代表树的高度。
  • 不要使用二叉树分组,新建一个分组表。

八、字段切割

  • 一张表最多20个字段,超过需要切割。
  • 实际上最多15个就够了,超过12个字段,就应该仔细看是不是有问题。

最后,以上就是我的个人经验,如有想法,请留言,感谢。

相关文章:

  • python:布伊山德U检验(Buishand U test,BUT)突变点检测(以NDVI时间序列为例)
  • 「AI工程师」数据处理与分析-工作指导
  • c语言,大宗撮合交易中心系统核心模块代码
  • Toyota Programming Contest 2024#3(AtCoder Beginner Contest 344)(A~C)
  • 【C/C++】常量指针与指针常量的深入解析与区分(什么是const int * 与 int * const ?)
  • [渗透教程]-013-嗅探工具-wireshark操作
  • python脚本批量关闭exe文件
  • 数据分析-Pandas最简单的方法画矩阵散点图
  • 【leetcode】429. N 叉树的层序遍历
  • Excel转pdf
  • appium2的一些配置
  • 【Linux】线程同步与生产消费者问题
  • 【蓝桥杯】蓝桥杯算法复习(一)
  • 【力扣白嫖日记】1164.指定日期的产品价格
  • 01、python_爬虫的相关概念
  • 345-反转字符串中的元音字母
  • iOS小技巧之UIImagePickerController实现头像选择
  • isset在php5.6-和php7.0+的一些差异
  • java第三方包学习之lombok
  • JSDuck 与 AngularJS 融合技巧
  • JS基础之数据类型、对象、原型、原型链、继承
  • Js基础知识(一) - 变量
  • linux学习笔记
  • miaov-React 最佳入门
  • NSTimer学习笔记
  • php ci框架整合银盛支付
  • Spark学习笔记之相关记录
  • unity如何实现一个固定宽度的orthagraphic相机
  • zookeeper系列(七)实战分布式命名服务
  • 程序员该如何有效的找工作?
  • 大主子表关联的性能优化方法
  • 区块链将重新定义世界
  • 如何借助 NoSQL 提高 JPA 应用性能
  • 如何用vue打造一个移动端音乐播放器
  • 数据科学 第 3 章 11 字符串处理
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 一份游戏开发学习路线
  • 异常机制详解
  • - 转 Ext2.0 form使用实例
  • gunicorn工作原理
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • 浅谈sql中的in与not in,exists与not exists的区别
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • #13 yum、编译安装与sed命令的使用
  • #前后端分离# 头条发布系统
  • $.ajax,axios,fetch三种ajax请求的区别
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (多级缓存)缓存同步
  • (六)软件测试分工
  • (没学懂,待填坑)【动态规划】数位动态规划
  • (篇九)MySQL常用内置函数
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (转)AS3正则:元子符,元序列,标志,数量表达符
  • *2 echo、printf、mkdir命令的应用