mysql创建表的规范

  1. 名称

    1. 建表的时候,给表,字段和索引起个好名字
      1. 见名知意:好的名字能够降低沟通和维护的成本
      2. 名字不宜过长,尽量控制在30个字符以内
    2. 大小写
      1. 名字尽量都用小写字母,因为从视觉上,小写字母更容易让人读懂
      2. 全部大写,看起来不太直观,一部分大写一部分小写更不可以
    3. 分隔符
      1. 单词之间没有分隔,或者单词间用驼峰标识,或者单词间用空格分隔,或者单词间用@分隔,都不建议
      2. 建议在单词之间使用下横线_分隔
    4. 表名
      1. 对于表名,在言简意赅,见名知意的基础上,建议带上业务前缀
      2. 如果是订单相关的业务表,可以在表名前面加个前缀:order_,比如order_pay
      3. 这样做的好处是为了方便归类,把相同业务的表,可以非常快速的聚集在一起
      4. 如果哪天有非订单的业务,比如:金融业务,也需要建一个名字叫做pay的表,可以取名:finance_pay,就能非常轻松的区分,这样就不会出现同名表的情况
    5. 字段名称
      1. 比如有些表用flag表示状态,而有些表使用status表示状态,可以统一一下,使用status表示状态
      2. 如果一个表使用了另一个表的主键,可以在另一张表的名后面,加_id,例如:product_spu_id
      3. 创建时间,可以统一为:create_time,修改时间统一为:update_time
      4. 删除状态固定位:delete_status
      5. 还有很多公共字段,在不同表之间,可以使用全局统一的命名规则,定义成相同的名称,以便大家好理解
    6. 索引名
      1. 普通索引和联合索引,其实是一类,在建立该类索引时,可以加ix_前缀,比如:ix_product_status
      2. 唯一索引,可以加ux_前缀,比如:ux_product_code
  2. 字段类型

    1. 时间格式的数据有:date,datetime,timestamp等可以选择
    2. 字符类型的数据有:varchar,char,text等可以选择
    3. 数字类型数据有:int,bigint,smallint,tinyint等可以选择
    4. 如果字段类型选大了,比如原本只有1-10之间的10个数字,结果选了bigint,他占了8个字节,其实1-10之间的10个数字,每个数字1个字节就能保存,选择tinyint更为合适,这样会白白浪费7个字节的空间
    5. 如果字段类型选小了,比如:一个18位的id字段,选择了int类型,最终数据会保存失败
    6. 所以选择一个合适的字段类型,是很重要的
    7. 参考原则:
      1. 尽可能选择占用存储空间小的字段类型,在满足正常业务需求的情况下,从小到大,往上选
      2. 如果字符串长度固定,或者差别不大,可以选择char类型,如果字符串长度差别较大,可以选择varchar类型
      3. 是否字段,可以选择bit类型
      4. 枚举字段:可以选择tinyint字段
      5. 主键字段:可以选择bigint类型
      6. 金额字段:可以选择decimal类型
      7. 时间字段:可以选择timestamp或datetime类型
  3. 字段长度

    1. 在mysql中除了varchar和char是代表字符长度外,其余类型都是代表字节长度
    2. bigint(4),bigint实际长度为8个字节,现在有一个数据a=1.a显示4个字节,所以在不满足4个字节时前面填充0(前提是该字段设置了zerofill属性),比如:0001,当满了4个字节时,比如现在数据是a=123456,他会按照实际的长度显示,比如123456,但需要注意的是,有些mysql客户端即使满了4个字节,也只能显示4个字节的内容,比如会显示成:1234,所以bigint(4),这里的4表示显示的长度为4个字节,实际长度还是占8个字节
  4. 字段个数

    1. 建表时需要对字段的个数做一定的限制
    2. 如果表的字段个数非常多,可以将一张大表拆分成多张小表,这几张表的主键相同
    3. 建议每表的字段个数,不超过20个
  5. 主键

    1. 在创建表时,一定要创建主键,因为主键自带了主键索引,相比于其他索引,主键索引的查询效率更高,因为他不需要回表
    2. 主键还是天然的唯一索引,可以根据他来判重
    3. 在单个数据库中,主键可以通过auto_increment,设置为自动增长的
    4. 但在分布式数据库中,特别是做了分库分表的业务库中,主键最好由外部算法(比如:雪花算法)生成,他能够保证生成的id是全局唯一的
    5. 主键建议保存跟业务无关的值,减少业务耦合性,方便今后的扩展
    6. 不过也有一些一对一的表关系,比如:用户表和用户扩展表,在保存数据时是一对一的关系,这样用户扩展表的主键,可以直接保存用户表的主键
  6. 存储引擎

    1. 在mysql8之前的版本,默认的存储引擎是myisam,而mysql8以后的版本,默认的存储引擎是innodb
    2. myisam的索引和数据分开存储,有利用查询,但他不支持事务和外键等功能
    3. innodb虽然查询性能稍微弱一点,但他支持事务和外键等,功能更强大一些
    4. 以前的建议是:读多写少的表,用myisam存储引擎,而写多读多的表,用innodb
    5. 但随着mysql对innodb存储引擎性能的不断优化,现在myisam和innodb查询性能相差已经越来越小
    6. 所以在使用mysql8之后的版本时,直接使用默认的innodb存储引擎即可,无需额外修改存储引擎
  7. not null

    1. 定义字段时,应该尽可能明确字段为NOT NULL
      1. 在innodb中,需要额外的空间存储null值,需要占用更多的空间
      2. null值可能会导致索引失效
      3. null值只能用is null或者is not null判断,用=号判断永远返回false
    2. 因此,建议定义字段时,能定义为not null,就定义为not null
    3. 如果某个字段直接定义成not null,万一有些地方忘了给该字段写值,就会insert不了数据
    4. alter table product_sku add column brand_id int(10) not null default 0;
  8. 外键

    1. 在mysql中,是存在外键的
    2. 外键存在的主要作用是:保证数据的一致性和完整性
    3. foreign key(cid) references class(id),student表的cid字段,保存的class表的id,这时通过foreign key增加了一个外键
    4. 如果直接通过student表的id删除数据,会报异常:a foreign key constraint fails
    5. 必须先删除class表对应的cid那条数据,再删除student表的数据才行,这样能够保证数据的一致性和完整性
    6. 只有存储引擎是innodb时,才能使用外键
    7. 一般不建议使用外键,因为这类系统更多的是为了性能考虑,宁可牺牲一点数据一致性和完整性
    8. 除了外键之外,存储过程和触发器也不建议使用,会影响性能
  9. 索引

    1. 在建表时,除了指定主键索引外,还需要创建一些普通索引
    2. id int(10) primary key auto_increment
    3. 普通索引:key ‘ix_spu_id’ (‘spu_id’) using btree
    4. 后面查询表的时候,效率更高
    5. 但索引字段也不能建的太多,可能会影响保存数据的效率,因为索引需要额外的存储空间
    6. 建议单表的索引个数不要超过5个
    7. 如果在建表时,发现索引个数超过5个了,可以删除部分普通索引,改成联合索引
    8. 在创建联合索引时,需要注意最左匹配原则,不然,建的联合索引效率可能不高
    9. 对于数据重复率非常高的字段,比如:状态,不建议单独创建普通索引,因为即使加了索引,如果mysql发现全表扫描效率更高,可能会导致索引失效
  10. 时间字段

    1. 时间字段的类型,目前mysql支持:date,datetime,timestamp,varchar等
    2. varchar类型可能是为了跟接口保持一致,接口中的时间类型为String
    3. 但是如果需要通过时间范围查询数据,效率会非常低,因为这种情况没法走索引
    4. date类型主要为了保存日期,比如:2024-07-02,不适合保存日期和时间,比如:2024-07-02 21:05:30
    5. 而datetime和timestamp类型更适合保存日期和时间
    6. timestamp:用4个字节来保存数据,他的取值范围为1970-01-01 00:00:00UTC - 2038-01-19 03:14:07,此外,还跟时区有关
    7. datetime:用8个字节保存数据,他的取值范围为:1000-01-01 00:00:00 - 9999-12-31 23:59:59,他和时区无关
    8. 优先推荐使用datetime类型保存时间和日期,可以保存的时间范围更大
    9. 在给时间字段设置默认值时,建议不要设置成:0000-00-00 00:00:00 不然查询表时可能会转换不了直接报错
  11. 金额字段

    1. mysql中有多个字段可以表示浮点数:float,double,decimal等
    2. float和double可能会丢失精度,因此推荐使用decimal类型保存金额
    3. 一般这样定义浮点数:decimal(m,n)
    4. 其中的n是指小数的长度,而m是指整数加小数的总长度
    5. 比如:decimal(10,2),则表示整数长度为8,并且保留2位小数
  12. JSON字段

    1. 某个字段保存的数据值不固定
    2. mysql支持按字段,查询json中的数据
  13. 唯一索引

    1. 可以给单个字段,加唯一索引
    2. 也可以给多个字段,加一个联合的唯一索引,联合的唯一索引,字段值出现null时,则唯一性约束可能会失效
    3. 创建唯一索引时,相关字段一定不能包含null值,否则唯一性会失效
  14. 字符集

    1. mysql支持的字符集有很多:latin1,utf-8,utf8mb4,GBK
    2. GBK:长度2,支持中文,但是不是国际通用的字符集
    3. UTF-8:长度3位,支持中英文混合场景,是国际通用字符集
    4. latin1:长度1位,mysql默认的字符集
    5. utf8mb4:长度4位,完全兼容UTF-8,用四个字节存储更多的字符
    6. latin1容易出现乱码问题,子啊实际项目中使用比较少
    7. 而GBK支持中文,但不支持国际通用字符,在实际项目中使用也不多
    8. 目前,mysql的字符集使用最多的还是utf-8和utf8mb4
    9. 其中utf-8占用3个字节,比utf8mb4的4个字节,占用更小的存储空间
    10. 但UTF-8有个问题:无法存储emoji表情,因为emoji表情需要4个字节,保存时会直接报错
    11. 建议在建表时字符集设置成:utf8mb4,会省去很多不必要的麻烦
  15. 排序规则

    1. 在mysql中创建表时,有个collate参数可以设置排序规则
    2. collate=utf8mb4_bin
    3. 字符排序规则跟字符集有关,比如字符集如果是utf8mb4,则字符排序规则也是以utf8mb4_开头的,常用的有:utf8mb4_general_ci,utf8mb4_bin等
    4. 其中utf8mb4_general_ci排序规则,对字母的大小写不敏感,不区分大小写
    5. 而utf8mb4_bin排序规则,对字符大小写敏感,区分大小写
    6. 比如:order表中有一条记录,name的值是大写的YOYO,但我们用小写的yoyo去查,select * from order where name = ‘yoyo’;
    7. 如果字符排序规则是utf8mb4_general_ci,则可以查出大写的YOYO的数据
    8. 如果字符排序规则是utf8mb4_bin,则查不出来
    9. 因此,字符排序规则,要根据实际的业务场景选择,否则容易出现问题
  16. 大字段

    1. 大字段,即占用较多存储空间的字段,比如用户评论
    2. 如果直接定义为text类型,可能会浪费存储空间,所以建议讲这类字段定义为varchar类型的存储效率更高
    3. 如果是合同数据,一个合同可能会占几MB,可以保存到mongodb中,然后在mysql的业务表中,保存mongodb表的id
  17. 冗余字段

    1. 在设计表的时候,为了性能考虑,提升查询速度,有时可以冗余一些字段
    2. 对查询性能有利,但需要额外的存储空间,还可能会有数据不一致的情况,比如用户名称修改了
    3. 我们在实际业务场景中,需要总和评估,冗余字段方案不适用于所有的业务场景
  18. 注释

    1. 在做表的设计时,一定要把表和相关字段的注释加好,并且经常需要更新这些注释

    2. ‘valid_status’ tinyint(1) not null default 1 comment ‘有效状态 1:有效 0 :无效’

    3. 特别是有些状态类型的字段,比如valid_status字段,该字段表示有效状态,1:有效,0:无效,

    4. 让人可以一目了然,表和字段是干什么用的,字段的值可能有哪些

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

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

相关文章

Linux嵌入式中MQTT的使用

MQTT是什么? MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(Publish/Subscribe)模式的轻量级通讯协议,该协议构建于TCP/IP协议上&#xff0…

驾驭npm更新之力:深入掌握npm update命令的精髓

驾驭npm更新之力:深入掌握npm update命令的精髓 在JavaScript和Node.js的世界中,npm(Node Package Manager)作为默认的包管理器,扮演着至关重要的角色。它不仅用于安装和管理项目依赖,还提供了更新这些依赖…

SpringBoot3.3集成knif4j-swagger文档方式和使用案例

springboot3 集成 knif4j &#xff1a; 访问地址&#xff1a; swagger 接口文档默认地址&#xff1a;http://localhost:8080/swagger-ui.html# Knife4j 接口文档默认地址&#xff1a;http://127.0.0.1:8080/doc.html Maven: <dependency><groupId>com.github.x…

2024 COMMUNITY DAY User Group 社区嘉年华 云计算与 AI 技术交融盛会共筑多元智慧未来

亚马逊云科技User Group&#xff0c;深圳 Community Day 活动流程抢先知道&#xff01; ⏰ 7月7日 &#x1f3e0; 深圳南山区香港中文大学 &#x1f4e3;主论坛国际大咖云集&#xff0c;共襄科技盛宴&#xff01; &#x1f389;三大主题论坛&#xff1a;人工智能、大数据、动…

MyBatis系列三: XxxMapper.xml-SQL映射文件

XxxMapper.xml-SQL映射文件 官方文档基本介绍详细说明基本使用parameterType(输入参数类型)传入HashMapresultMap(结果集映射) 官方文档 文档地址: https://mybatis.org/mybatis-3/zh_CN/sqlmap-xml.html 基本介绍 1.MyBatis的真正强大在于它的语句映射(在XxxMapper.xml配置…

2024年06月CCF-GESP编程能力等级认证Python编程一级真题解析

本文收录于专栏《Python等级认证CCF-GESP真题解析》,专栏总目录:点这里,订阅后可阅读专栏内所有文章。 一、单选题(每题 2 分,共 30 分) 第 1 题 小杨父母带他到某培训机构给他报名参加CCF组织的GESP认证考试的第1级,那他可以选择的认证语言有几种?( ) A. 1 B. 2 C…

React@16.x(45)路由v5.x(10)源码(2)- history

目录 1&#xff0c;作用1.1&#xff0c;createBrowserHistory1.2&#xff0c;createHashHistory1.3&#xff0c;createMemoryHistory 2&#xff0c;history 对象的属性2.1&#xff0c;action2.2&#xff0c;push / replace / go / goBack / goForward2.3&#xff0c;location2.…

网络配线架的隐藏功能

网络布线是确保现代信息社会高效运转的关键技术之一。在这一领域&#xff0c;网络配线架扮演着至关重要 的角色。它不仅仅是一个简单的物理连接点&#xff0c;更拥有许多隐藏功能&#xff0c;这些功能极大地提升了网络的 效率、稳定性和可管理性。 1、集中管理 网络配线架提…

【BES2500x系列 -- RTX5操作系统】深入探索CMSIS-RTOS RTX -- 同步与通信篇 -- 消息队列和邮箱处理 --(四)

&#x1f48c; 所属专栏&#xff1a;【BES2500x系列】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f49…

经典FC游戏web模拟器--EmulatorJS

简介 EmulatorJS是一个基于JavaScript和Webassembly技术的虚拟环境的实现&#xff0c;可以在网页中运行各种经典FC游戏系统&#xff0c;支持任天堂、世嘉、雅达利等经典红白机。EmulatorJS的诞生使得诸如超级玛丽、坦克大战、魂斗罗等经典FC游戏能够以一种全新的方式回归。本文…

SAP MM模块的ATP检查

前面几篇文章都演示和说明ATP的一些设置和操作&#xff0c;通常情况下ATP的检查PP模块&#xff0c;SD模块用的相对来说是比较多的&#xff0c;但是实际上MM模块也会遵循ATP的可用性的检查规则。 当我们在做311、301等移动类型时&#xff0c;系统会根据相应的可用性检查规则&am…

Linux常用指令汇总

Linux常用指令汇总 Cfilt 功能&#xff1a;解析C程序中被修饰的符号&#xff0c;比如变量与函数名称。 示例&#xff1a; 解析编译器 g 修饰的函数名称。 cfilt -s gnu-v3 _Z5printRKSs print(std::basic_string<char, std::char_traits<char>, std::allocator<…

Django 多对多关系

多对多关系作用 Django 中&#xff0c;多对多关系模型的作用主要是为了表示两个模型之间的多对多关系。具体来说&#xff0c;多对多关系允许一个模型的实例与另一个模型的多个实例相关联&#xff0c;反之亦然。这在很多实际应用场景中非常有用&#xff0c;比如&#xff1a; 博…

【每日一个Git命令: cherry-pick】

git cherry-pick 命令的作用是将指定的提交&#xff08;commit&#xff09;应用到其他分支上。这个命令允许你选择一个或多个已有的提交&#xff0c;并将它们作为新的提交引入到当前分支中。 这个过程不会改变项目的历史记录&#xff0c;因为它实际上是创建了这些提交的副本。…

BMA530 运动传感器

型号简介 BMA530是博世&#xff08;bosch-sensortec&#xff09;的一款运动传感器。时尚简约的可穿戴设备为功能强大的组件提供了很小的空间。具有先进功能集的下一代加速度计是世界上最小的加速度传感器&#xff08;1.2 x 0.8 x 0.55 mm&#xff09;。它专为紧凑型设备而设计&…

24/07/02数据结构(1.1201)算法效率顺序表

数据结构基本内容:1.时间复杂度 空间复杂度2.顺序表链表3.栈 队列4.二叉树5.排序 数据结构是存储,组织数据的方式.指相互之间存在一种或多种特定关系的数据元素的集合 算法是定义良好的计算过程.取一个或一组值为输入并产生一个或一组值为输出. 需要知道虽然选择题有20-30个…

Leetcode1114 交替打印 FooBar及其测试

题目描述 相关标签 相关企业 给你一个类&#xff1a; class FooBar { public void foo() { for (int i 0; i < n; i) { print(“foo”); } } public void bar() { for (int i 0; i < n; i) { print(“bar”); } } } 两个不同的线程将会共用一个 FooBar 实例&#xf…

python自动化运维--DNS处理模块dnspython

1.dnspython介绍 dnspython是Pyhton实现的一个DNS工具包&#xff0c;他几乎支持所有的记录类型&#xff0c;可以用于查询、传输并动态更新ZONE信息&#xff0c;同事支持TSIG&#xff08;事物签名&#xff09;验证消息和EDNS0&#xff08;扩展DNS&#xff09;。在系统管理方面&a…

Linux高并发服务器开发(九)Tcp状态转移和IO多路复用

文章目录 0 包裹函数1 多进程服务器流程代码 2 多线程服务器3 TCP状态转移半关闭心跳包 4 端口复用5 IO多路复用技术高并发服务器 6 select代码总结 7 POLLAPI代码poll相对select的优缺点 8 epoll&#xff08;重点&#xff09;API监听管道代码EPOLL 高并发服务器 9 Epoll的两种…

Iot解决方案开发的体系结构模式和技术

前言 Foreword 计算机技术起源于20世纪40年代&#xff0c;最初专注于数学问题的基本原理&#xff1b;到了60年代和70年代&#xff0c;它以符号系统为中心&#xff0c;该领域首先开始面临复杂性问题&#xff1b;到80年代&#xff0c;随着个人计算的兴起和人机交互的问题&#x…