- 数据库表的设计范式(三大范式)
第一范式(1NF)即表的列的具有原子性,不可再分解,即列的信息,不能分解。通俗理解即一个字段只存储一项信息。
第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。第二范式要求每个表只描述一件事。
第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。
- 存储引擎的选择
使用InnoDB存储引擎, 支持事务、行级锁、外键和外键索引、并发性能更好、CPU及内存缓存页优化使得资源利用率更高
- 字符集选择
字符集采用utf8mb4(兼容utf8, 且比utf8能表示更多的字符)
排序规则采用utf8mb4_general_ci(不区分大小写, 核对速度快, 准确度稍差, 但一般都够使用)
- 命名约束
1. 命名必须控制在32个字符以内,表名只能使用字母、数字和下划线,一律小写。
2. 主键的名称以“pk_”开头,唯一键以“uk_”或“uq_”开头,普通索引以“idx_”开头,一律使用小写格式,以表名/字段的名称或缩写作为后缀。
3. 同一模块使用的表名尽量使用统一前缀
4. 同一字段在不同的表中也应是相同的类型和长度
5. 禁用保留字,如desc、range、match、delayed等,请参考MySQL官方保留字
6. 临时表以tmp前缀,以日期为后缀。备份库以bak前缀,以日期后缀
- 索引设计
1. 单个索引中每个索引记录的长度不能超过64KB
2. 单个表上的索引个数不能超过7个
3. InnoDB 表强制要求有主键列
4. 建立复合索引时,优先将选择性高的字段放在前面
- 数据库表设计与规划
1. 创建表时必须显式指定字符集为utf8或utf8mb4
2. 创建表时必须显式指定表存储引擎类型,如无特殊需求,一律为InnoDB
3. 建表必须有comment
4. 表中所有字段必须都是NOT NULL属性,业务可以根据需要定义DEFAULT值。因为使用NULL值会存在每一行都会占用额外存储空间、数据迁移容易出错、聚合函数计算结果偏差等问题
5. 不要在数据库中使用varbinary或blob存储图片及文件,mysql 并不适合大量存储这类型文件
6. 建议对表里的blob、text等大字段,垂直拆分到其他表里,仅在需要读这些对象的时候才去select
7. 存储时间时,建议使用timestamp类型,因为timestamp使用的是4字节,datetime使用的是8字节
8. 尽可能不要使用text,blob类型
9. 需要多表join的字段,数据类型保持绝对一致
10.业务中选择性很少的状态status、类型type等字段推荐使用tinytint或者smallint类型节省存储空间
11.不推荐使用blob,text等类型。它们都比较浪费硬盘和内存空间。在加载表数据时,会读取大字段到内存里从而浪费内存空间,影响系统性能
12.文本数据尽量用varchar存储。因为varchar是变长存储,比char更省空间