专业IT网络知识平台,分享IT百科知识、生活百科知识解答!

易企推科技
易企推科技

数据库设计规范,mysql数据库设计规范

来源:小易整编  作者:小易  发布时间:2023-03-23 12:06
摘要:数据库设计规范,mysql数据库设计规范规范背景与目的MySQL数据库与Oracle、SQLServer等数据库相比,有其内核上的优势与劣势。我们在使用MySQL数据库的时候需要遵循一定规范,扬长避短。本规范旨在帮助或指导RD、QA、OP等...

数据库设计规范,mysql数据库设计规范

数据库设计规范,mysql数据库设计规范

规范背景与目的

MySQL 数据库与 Oracle、 SQL Server 等数据库相比,有其内核上的优势与劣势。我们在使用 MySQL 数据库的时候需要遵循一定规范,扬长避短。本规范旨在帮助或指导 RD、QA、OP 等技术人员做出适合线上业务的数据库设计。在数据库变更和处理流程、数据库表设计、SQL 编写等方面予以规范,从而为公司业务系统稳定、健康地运行提供保障。

数据库设计

以下所有规范会按照【高危】、【强制】、【建议】三个级别进行标注,遵守优先级从高到低。

对于不满足【高危】和【强制】两个级别的设计,DBA 会强制打回要求修改。

一般命名规则

  1. 【强制】使用小写,有助于提高打字速度,避免因大小写敏感而导致的错误。

  2. 【强制】没有空格,使用下划线代替。

  3. 【强制】名称中没有数字,只有英文字母。

  4. 【强制】有效的可理解的名称。

  5. 【强制】名称应该是自我解释的。

  6. 【强制】名称不应超过 32 个字符。

  7. 【强制】避免使用前缀。

  1. 【强制】遵守以上全部一般命名规则。

  2. 【强制】使用单数。

  3. 【强制】库的名称格式:业务系统名称_子系统名。

  4. 【强制】一般分库名称命名格式是库通配名_编号,编号从 0 开始递增,比如 northwind_001,以时间进行分库的名称格式是库通配名_时间。

  5. 【强制】创建数据库时必须显式指定字符集,并且字符集只能是 utf8 或者 utf8mb4。创建数据库 SQL 举例:

create database db_name default character set utf8;

  1. 【强制】遵守以上全部一般命名规则。

  2. 【强制】使用单数。

  3. 【强制】相关模块的表名与表名之间尽量体现 join 的关系,如 user 表和 user_login 表。

  4. 【强制】创建表时必须显式指定字符集为 utf8 或 utf8mb4。

  5. 【强制】创建表时必须显式指定表存储引擎类型,如无特殊需求,一律为 InnoDB。当需要使用除 InnoDB/MyISAM/Memory 以外的存储引擎时,必须通过 DBA 审核才能在生产环境中使用。因为 InnoDB 表支持事务、行锁、宕机恢复、MVCC 等关系型数据库重要特性,为业界使用最多的 MySQL 存储引擎。而这是其它大多数存储引擎不具备的,因此首推 InnoDB。

  6. 【强制】建表必须有 comment。

  7. 【强制】关于主键:(1) 命名为 id,类型为 int 或 bigint,且为 auto_increment;(2) 标识表里每一行主体的字段不要设为主键,建议设为其它字段如 user_id,order_id等,并建立 unique key 索引。因为如果设为主键且主键值为随机插入,则会导致 InnoDB 内部 page 分裂和大量随机 I/O,性能下降。

  8. 【建议】核心表(如用户表,金钱相关的表)必须有行数据的创建时间字段 create_time 和最后更新时间字段 update_time,便于排查问题。

  9. 【建议】表中所有字段必须都是 NOT NULL 属性,业务可以根据需要定义 DEFAULT 值。因为使用 NULL 值会存在每一行都会占用额外存储空间、数据迁移容易出错、聚合函数计算结果偏差等问题。

  10. 【建议】建议对表里的 blob、text 等大字段,垂直拆分到其它表里,仅在需要读这些对象的时候才去 select。

  11. 【建议】反范式设计:把经常需要 join 查询的字段,在其它表里冗余一份。如 username 属性在 user_account,user_login_log 等表里冗余一份,减少 join 查询。

  12. 【强制】中间表用于保留中间结果集,名称必须以 tmp_ 开头。备份表用于备份或抓取源表快照,名称必须以 bak_ 开头。中间表和备份表定期清理。

  13. 【强制】对于超过 100W 行的大表进行 alter table,必须经过 DBA 审核,并在业务低峰期执行。因为 alter table 会产生表锁,期间阻塞对于该表的所有写入,对于业务可能会产生极大影响。

字段

  1. 【强制】遵守以上全部一般命名规则。

  2. 【建议】尽可能选择短的或一两个单词。

  3. 【强制】避免使用保留字作为字段名称:order,date,name 是数据库的保留字,避免使用它。可以为这些名称添加前缀使其易于理解,如 user_name,signup_date 等。

  4. 【强制】避免使用与表名相同的字段名,这会在编写查询时造成混淆。

  5. 【强制】在数据库模式上定义外键。

  6. 【强制】避免使用缩写或基于首字母缩写词的名称。

  7. 【强制】外键列必须具有表名及其主键,例如:blog_id 表示来自表博客的外键 id。

字段数据类型优化

  1. 【建议】表中的自增列(auto_increment 属性),推荐使用 bigint 类型。因为无符号 int 存储范围为 0~4,294,967,295(不到 43 亿),溢出后会导致报错。

  2. 【建议】业务中选择性很少的状态 status、类型 type 等字段推荐使用 tinytint 或者 smallint 类型节省存储空间。

  3. 【建议】业务中 IP 地址字段推荐使用 int 类型,不推荐用 char(15)。因为 int 只占 4 字节,可以用如下函数相互转换,而 char(15) 占用至少 15 字节。

select inet_aton('192.168.2.12');select inet_ntoa(3232236044);

Java 保存字符串ip 转 int 类型

public static long ipToLong(String addr){    String[] addrArray = addr.split("\\.");    long num = 0;    for (int i = 0; i < addrArray.length; i++)    {        int power = 3 - i;        num += ((Integer.parseInt(addrArray[i]) % 256 * Math.pow(256, power)));    }    return num;}public static String longToIp(long i){    return ((i >> 24) & 0xFF) + "." +           ((i >> 16) & 0xFF) + "." +           ((i >> 8) & 0xFF) + "." +           (i & 0xFF);}

4.【建议】不推荐使用 enum,set。 因为它们浪费空间,且枚举值写死了,变更不方便。推荐使用 tinyint 或 smallint。


本文地址:IT问答频道 https://www.hkm168.com/itwenda/937348.html,易企推百科一个免费的知识分享平台,本站部分文章来网络分享,本着互联网分享的精神,如有涉及到您的权益,请联系我们删除,谢谢!


IT问答
小编:小易整编
相关文章相关阅读
  • mysql中的不等于符号是什么

    mysql中的不等于符号是什么

    mysql中的不等于符号有两种:“!=”和“”;它们都可用于判断数字、字符串、表达式是否不相等。对于“!=”和“”,如果两侧操作数不相等,返回值为1,否则返回值为0;如果两侧操作数有一个是null,那么返回值也是null。本教程操作环境:w...

  • mysql列转行函数是什么

    mysql列转行函数是什么

    在mysql中,列转行函数是“group_concat()”函数;该函数用于将非空列值按照分组条件进行合并并最终返回,如果其中有空值则返回的结果是空,语法为“selectgroup_concat(name separator';')列...

  • MySQL连接被重置,如何处理?

    MySQL连接被重置,如何处理?

    mysql连接被重置,如何处理?MySQL是一种常用的关系型数据库管理系统,广泛应用于各种不同规模的项目中。然而,在使用MySQL时,有时会遇到连接被重置的情况,这可能会给我们的项目带来一些麻烦。本文将介绍MySQL连接被重置的原因以及如何...

  • 什么是结构化程序设计

    什么是结构化程序设计

    结构化程序设计是一种使程序更加清晰、易于理解和维护的编程方法论。通过将程序划分为不同的模块,并使用控制结构来组织这些模块,结构化程序设计使程序的开发和维护更加高效和可靠,无论是初学者还是有经验的开发者,都应该掌握结构化程序设计的基本原理和技...

  • javascript中的设计模式有哪些

    javascript中的设计模式有哪些

    javascript中的设计模式有:单例模式、策略模式、代理模式、迭代器模式、“发布-订阅”模式、命令模式、组合模式、模板方法模式、享元模式、职责链模式、中介者模式、装饰者模式、状态模式、适配器模式、外观模式等。本教程操作环境:window...

  • 数据库的substr函数用法是什么

    数据库的substr函数用法是什么

    数据库的substr函数用法:1、【substr(str,pos,len)】从pos开始的位置,截取len个字符;2、【substr(str,pos)】pos开始的位置,一直截取到最后。数据库的substr函数用法:1、SUBSTR(st...

  • mysql环境变量如何配置

    mysql环境变量如何配置

    mysql环境变量的配置方法:1、找到c盘中的mysql安装路径;2、在“我的电脑"中,依次点击“系统属性”-“高级系统设置”选项;3、在“环境变量”弹窗中,依次点击“高级”-“系统变量”;4、找到path路径,点击“编辑”选项,......

  • 什么是数据库架构?数据库架构有几层

    什么是数据库架构?数据库架构有几层

    一:什么是数据库架构DBMS体系结构有助于数据库的设计,开发,实现和维护,数据库可以存储企业的关键信息,选择正确的数据库体系结构有助于快速安全地访问数据。二:数据库架构有几层1层架构最简单的数据库体系结构是1层,其中客户端,服务器和数据库都...

  • 周排行
  • 月排行
  • 年排行

精彩推荐