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

MySQL必看表设计经验汇总-上(精华版)

目录

1.命名要规范

2选择合适的字段类型

3.主键设计要合理

4.选择合适的字段长度

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

6.每个表都需要添加通用字段

7.一张表的字段不宜过多


前言

在数据库设计中,命名规范、合适的字段类型、主键设计、字段长度、逻辑删除、通用字段和表的字段数量都是非常重要的考虑因素。合理的数据库设计能够提高数据管理和查询效率,减少空间浪费和复杂性,并且符合命名规范能够使数据库结构更加清晰易懂。

1.命名要规范

数据库表名、字段名、索引名等都需要命名规范。命名可读性要高,尽量使用英文,采用驼峰或者下线分割的方式,让人见名知意。

反例:这些命名没有遵循统一规范,缺乏描述性,很难让人见名知意

表名yh(用户表),shangpin(商品表),yhdd(用户订单表)
字段名yhm(用户名),mm(密码),sjh(手机号)
索引名index1(用户id),index2(商品id),index3(订单id)

正例:见名知意

表名user_info,product_info,order_info
字段名user_name,password,phone
索引名idx_order_user,idx_product_id,idx_order_id

技巧:

表名,字段名必须使用小写字母,禁止数字开头,禁止用拼音,尽可能不用英文缩写

主键索引名为pk_字段名,唯一索引名为uk_字段名,普通索引名为idx_字段名。

2选择合适的字段类型

根据数据类型选择字段类型:不同的数据类型应该使用不同的字段类型。

  • 整数型数据可以使用INT或BIGINT类型
  • 浮点型数据可以使用 FLOAT或DOUBLE
  • 类型字符型数据可以使用VARCHAR或CHARr类型

考虑数据长度: 字段类型应该根据所需存储的数据长度来选择。

  • 如果某个字段的数据长度不会超过 10 个字符,则可以使用 CHAR(10)类型代替VARCHAR(50)类型,以节省空间。
  • 如果存储的值太大,建议字段类型修改为text,同时抽出单独一张表,用主键与之对应

注意精度和小数位数。

  • 对于需要精确数值计算的字段(如货币和百分比),应该选择带有精度和小数
  • 位数的字段类型(如 DECIMAL)。

考虑数据完整性:字段类型也应该考虑到数据完整性。

  • 日期型数据应该使用DATE或DATETIME类型,以确保输入的日期格式正确

3.主键设计要合理

主键的设计在数据库中非常重要,它用于唯一标识表中的每一行数据,并且在数据操作和查询中起到关键作用。通常主键的设计,不要与业务相关联,因为业务是会发生变化的,应当

使用自增的 id,并且保持主键的连续性。如果说是分布式系统可以使用优化的雪花id 等等

注意:不推荐使用uuid当主键(会带来性能、索引效率等问题)

4.选择合适的字段长度

在mysql中,varchar和char类型表示字符长度,而其他类型表示的长度都表示字节长度。

char(10)表示字符长度是10。(例如,存储 "hello" 时,剩余的 6 个字符会以空格符填充。
bigint (4)表示显示长度是4个字节,但是因为bigint实际长度是8个字节,所以bigint (4)的实际长度就是8个字节(位数不足时会在左侧填充 0 直到满足位数要求)。

所以在设计表时需要充分考虑一个字段的长度,比如一个用户名字段 (它的长度5~20个字符)可以考虑设置为 varchar (32)。需要注意字段长度一般设置为2的n次方。

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

  • 物理删除:把数据从硬盘中删除,可释放存储空间
  • 逻删除:给数据添加一个字段,比如is deleted,以标记该数据已经逻辑删除

物理删除会带来以下问题:

  • 数据恢复困难
  • 物理删除会导致索引树重构

6.每个表都需要添加通用字段

一个表除了添加业务字段还应该加入通用字段比如:

  • id: 主键,一个表必须得有主键,必须
  • create time: 创建时间
  • creator:创建人
  • update_time:修改时间,必须,更新记录时,需要更新它
  • update_by :修改人,非必须
  • remark:数据记录备注,非必须

7.一张表的字段不宜过多

建表的时候一张表的字段不要太多了。尽量不超过 20个。超出的话优先考虑拆分,也就是通常的查询表,详情表。

  • 查询效率:当表中保存的数据数量很大时,查询操作需要检索的数据也会随之增加。如果表的字段数过多,查询操作就需要读取更多的数据,这会导致查询效率变慢
  • 存储空间:表的字段数越多每一行数据占用的存储空间也就越大。对于大型数据库来说,这可能会导致磁盘空间的浪费
  • 数据库设计复杂性:当表的字段数过多时,数据库的设计和维护变得更加复杂。这可能涉及到索引和关联表的设计,以确保数据的完整性、一致性。

相关文章:

  • Linux之常见的管理命令
  • java日志框架总结(三 、Log4j日志框架)
  • SQL注入-sqli-labs-master第一关
  • 微信生成带参数二维码(用户id), 扫码可获取用户id
  • 免费开源的微信小程序源码、小游戏源码精选70套!
  • Python一行命令搭建HTTP服务器并外网访问 - 内网穿透
  • Unity——八叉树的原理与实现
  • 算法每日一题: 最大合金数 | 二分
  • 概念抽取:构建认知基础的关键步骤
  • 面试经典 150 题 ---- 移除元素
  • 方玲老师谈中国传统祭祖深远的意义
  • 计算机网络之NAT
  • arm 汇编调用C
  • Go黑帽子(第二章)
  • Go语言常用标准库fmt、格式化占位符、获取输入
  • @angular/forms 源码解析之双向绑定
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • 《用数据讲故事》作者Cole N. Knaflic:消除一切无效的图表
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • 【跃迁之路】【585天】程序员高效学习方法论探索系列(实验阶段342-2018.09.13)...
  • Angular4 模板式表单用法以及验证
  • JavaScript对象详解
  • Java小白进阶笔记(3)-初级面向对象
  • JS实现简单的MVC模式开发小游戏
  • leetcode386. Lexicographical Numbers
  • Linux中的硬链接与软链接
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • node和express搭建代理服务器(源码)
  • Python - 闭包Closure
  • spring-boot List转Page
  • ViewService——一种保证客户端与服务端同步的方法
  • 学习Vue.js的五个小例子
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • #define,static,const,三种常量的区别
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • $.ajax中的eval及dataType
  • (python)数据结构---字典
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (附源码)spring boot火车票售卖系统 毕业设计 211004
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (七)c52学习之旅-中断
  • (四)模仿学习-完成后台管理页面查询
  • (算法)求1到1亿间的质数或素数
  • (一)Linux+Windows下安装ffmpeg
  • (转)编辑寄语:因为爱心,所以美丽
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...
  • .FileZilla的使用和主动模式被动模式介绍
  • .NET / MSBuild 扩展编译时什么时候用 BeforeTargets / AfterTargets 什么时候用 DependsOnTargets?
  • .NET 4.0中的泛型协变和反变
  • .NET Core WebAPI中使用Log4net 日志级别分类并记录到数据库
  • .NET delegate 委托 、 Event 事件
  • .NET 命令行参数包含应用程序路径吗?