mysql数据库设计pdf_MYSQL数据库设计规范 PDF 下载

主要内容:

一、基础规范

1、【高危】使用InnoDB 存储引擎

没有特殊要求(即Innodb无法满足的功能如:列存储,存储空间数据等)的情况下,所有表必须使用Innodb存储引擎(mysql5.5之前默认使用Myisam,5.6以后默认的为Innodb)Innodb 支持事务,支持行级锁,更好的恢复性,高并发下性能更好

2、【强制】表字符集使用utf8mb4

默认使用 utf8mb4 字符集,数据库排序规则使用 utf8mb4_general_ci,采用 utf8 编码的 MySQL 无法保存占位是 4 个字节的 Emoji 表情。为了使后端的项目全面支持客户端输入的 Emoji 表情,升级编码为 utf8mb4 是最佳解决方案;

兼容性更好,统一字符集可以避免由于字符集转换产生的乱码,不同的字符集进行比较前需要进行转换会造成索引失效

3、【强制】所有表所有字段都需要添加注释

使用comment从句添加表和列的备注 从一开始就进行数据字典的维护

4、【强制】单表数据量建议控制在500万以内

500万并不是MySQL数据库的限制,过大会造成修改表结构,备份,恢复都会有很大的问题,可以用历史数据归档(应用于日志数据),分库分表(应用于业务数据)等手段来控制数据量大小

5、【高危】不在数据库中存储图、文件等大的二进制数据

通常文件很大,会短时间内造成数据量快速增长,数据库进行数据库读取时,通常会进行大量的随机IO操作,文件很大时,IO操作很耗时 通常存储于文件服务器,数据库只存储文件地址信息

6、【高危】尽量做到冷热数据分离,减小表的宽度

MySQL限制每个表最多存储4096列,并且每一行数据的大小不能超过65535字节 减少磁盘IO,保证热数据的内存缓存命中率(表越宽,把表装载进内存缓冲池时所占用的内存也就越大,也会消耗更多的IO) 更有效的利用缓存,避免读入无用的冷数据 经常一起使用的列放到一个表中(避免更多的关联操作)

7、【强制】禁止在线上做数据库压力测试

8、【强制】禁止测试、开发环境直连数据库

二、命名规范

1、【强制】库名、表名、字段名必须使用小写字母,并采用下划线分割

MySQL有配置参数lower_case_table_names=1,即库表名以小写存储,大小写不敏感。如果是0,则库表名以实际情况存储,大小写敏感;如果是2,以实际情况存储,但以小写比较

如果大小写混合使用,可能存在abc,Abc,ABC等多个表共存,容易导致混乱

字段名显示区分大小写,但实际使用时不区分,即不可以建立两个名字一样但大小写不一样的字段

为了统一规范, 库名、表名、字段名使用小写字母,不允许 - 号

2、【强制】库名、表名、字段名禁止超过32个字符,需见名知意,建议使用名词不是动词

库名、表名、字段名支持最多64个字符,但为了统一规范、易于辨识以及减少传输量,禁止超过32个字符

3、【强制】库名、表名、字段名禁止使用MySQL保留字

当库名、表名、字段名等属性含有保留字时,SQL语句必须用反引号引用属性名称,这将使得SQL语句书写、SHELL脚本中变量的转义等变得非常复杂

4、【强制】临时库、表名必须以tmp为前缀,并以日期为后缀

形如:tmp_user_account_20190313

5、【强制】备份库、表必须以bak为前缀,并以日期为后缀

形如:bak_user_account_20190313

6、【强制】主键索引名为 pk_ 字段名;唯一索引名为 uk _ 字段名;普通索引名则为 idx_ 字段名

pk_ 即 primary key;uk_ 即 unique key;idx_ 即 index 的简称

7、【强制】在不同的库或表中,要保证所有存储相同数据的列名和列类型必须一致

一般作为关联列,如果查询时关联列类型不一致会自动进行数据类型隐式转换,会造成列上的索引失效,导致查询效率降低

8、【强制】表的命名最好是加上“业务名称_表的作用”

正例:user_task / force_project / trade_config

9、【强制】表名要求模块名强相关,如师资系统采用”sz”作为前缀,渠道系统采用”qd”作为前缀等。

10、【建议】表中所有字段必须都是NOT NULL属性,业务可以根据需要定义DEFAULT值。

因为使用NULL值会存在每一行都会占用额外存储空间、数据迁移容易出错、聚合函数计算结果偏差等问题

三、字段设计规范

1、【强制】优先选择符合存储需要的最小的数据类型

列的字段类型越大,建立索引占据的空间就越大,导致一个页中的索引越少,造成IO次数增加,影响性能

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

能用int的就不用char或者varchar

能用tinyint的就不用int

使用 UNSIGNED 存储非负数值

使用tinyint来代替 enum和boolean

存储 ip 最好用 int存储而非 char(15)

通过MySQL函数inet_ntoa和inet_aton来进行转化。IPv6地址目前没有转化函数,需要使用DECIMAL或两个BIGINT来存储SELECT INET_ATON('209.207.224.40'); 3520061480SELECT INET_NTOA(3520061480); 209.207.224.40

表中的自增列(auto_increment属性),推荐使用bigint类型

2、【强制】不推荐使用blob,text等类型

blob,text是为了存储极大的字符串而设计的数据类型,采用二进制与字符串方式存储,该数据类型不能设置默认值、不便于排序、不便于建立索引, varchar 的性能会比 text 高很多,如果非要使用,建议将这种数据分离到单独的拓展表中,垂直拆分到其他表里,仅在需要读这些对象的时候才去select。

3、【强制】禁止使用字符串来存储日期型数据

无法使用日期函数计算比较

字符串存储要占更多的内存空间,datetime(8字节)和timestamp(本身是以int存储,占4字节,范围:1970-01-01 00:00:01到2038-01-19 03:14:07)

TIMESTAMP 记录经常变化的更新/创建/发布/日志时间等,并且是近来的时间,够用,可免时区处理

DATETIME 记录生日、纪念事件、超出 TIMESTAMP 的时间,记得时区处理

4、【强制】用 DECIMAL 代替 FLOAT 和 DOUBLE 存储精确浮点数

Decimal类型为精准浮点数,float 和 double 在存储的时候,存在精度损失的问题,很可能在值的比较时,得到不正确的结果。如果存储的数据范围超过 decimal 的范围,建议将数据拆成整数和小数分开存储。

5、【强制】必须把字段定义为NOT NULL并设默认值

NULL的列使用索引,索引统计,值都更加复杂,MySQL更难优化

NULL需要更多的存储空间

NULL只能采用IS NULL或者IS NOT NULL,而在=/!=/in/not in时有大坑

6、【强制】使用varchar(20)存储手机号,不要使用整数

牵扯到国家代号,可能出现+/-/()等字符,例如+86

手机号不会用来做数学运算

varchar可以模糊查询,例如like ‘138%’

7、【建议】根据业务区分使用char/varchar

字段长度固定,或者长度近似的业务场景,适合使用char,能够减少碎片,查询性能高

字段长度相差较大,或者更新较少的业务场景,适合使用varchar,能够减少空间

8、【强制】禁止在数据库中存储明文密码,把密码加密后存储

9、【建议】尽量不使用外键

建议在应用层实现外键的逻辑, 外键与级联更新不适合高并发场景,降低插入性能,大并发下容易产生死锁

XXX数据库设计规范模板 目 次 1 范围 2 引用文件 3 术语、定义和缩略语 3.1 术语 3.2 缩略语 4 总体要求 4.1 数据库设计总体要求 4.2 数据库编程总体要求 5 数据库设计要求 5.1 数据库字符集选择 5.2 数据库表空间设计原则 5.3 数据库分区设计原则 5.4 数据库对象命名要求 6 数据库实体设计要求 6.1 设计原则 6.2 设计方法 6.3 数据类型使用要求 6.4 数据库实体命名要求 7 数据库开发要求 7.1 数据库编程要求 7.2 索引使用要求 7.3 视图使用要求 8 数据库安全要求 8.1 用户密码要求 8.2 管理默认用户 8.3 数据库级用户权限设计 8.4 应用级用户设计 1 范围 本标准规定了XXX。 本标准适用 XXX。 2 引用文件 下列文件中的有关条款通过引用而成为本标准的条款。 《XXXXX》 3 术语、定义和缩略语 3.1 术语 XXX YYY 3.2 缩略语 DB--数据库; DBMS--数据库管理系统; … 4 总体要求 4.1 数据库设计总体要求 如规范性、扩展性等。 4.2 数据库编程总体要求 如可读性、可维护性等 5 数据库设计要求 5.1 数据库字符集选择 如UTF8。 5.2 数据库表空间设计原则 5.3 数据库分区设计原则 如分区规则。 5.4 数据库对象命名要求 命名要求 如可用字符、大小写等。 数据库实例命名要求 SID_XXX 表空间命名要求 TS_XXX。 数据文件命名要求 XXX。 分区命名要求 分区名以"P+分区名"组成。 数据库模式命名要求 XXX 6 数据库实体设计要求 6.1 设计原则 数据实体设计应遵循一致性、实用性和扩充性原则等。 6.2 设计方法 范式要求 3NF XXX。 表设计 设计表约束 XXX。 索引设计 索引约束 XXX。 视图设计 视图约束 XXX。 6.3 数据类型使用要求 字符类型 固定长度的字串类型采用char,长度不固定的字串类型采用 varchar。避免在长度不固定的情况下采用char类型。 数字类型 数字类型要区分整型和浮点型,如果是浮点型,要定义数值精度范 围。 … 6.4 数据库实体命名要求 命名要求 具体的命名规则 实体命名要求 表。 视图 … 实体类型前缀定义 各数据库实体类型前缀定义如下表所示: 表 1 实体类型前缀定义 实体类型 实体类型前缀 表 T 分区 TP 主键 PK 外键 FK Check约束 CK 普通视图 V 物化视图 MV 索引 IX 函数 FN 存储过程 SP 触发器 TR 序列 SQ 7 数据库开发要求 7.1 数据库编程要求 书写要求 书写代码时应遵循要求 注释要求 程序的注释要求: 语法要求 程序语法要求: SQL编写要求 高效性 在编写SQL语句时应注意XXX: 安全性 XXX。 完整性 XXX。 7.2 索引使用要求 XXX 7.3 视图使用要求 XXX 8 数据库安全要求 8.1 用户密码要求 XXX 8.2 管理默认用户 XXX 8.3 数据库级用户权限设计 XXX 8.4 应用级用户设计 XXX
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值