1、命名
1.1 见名知意
好名字:简洁明了,一目了然。
坏名字:不清晰、难以理解,造成混乱。
反例:用户名称字段:yong_hu_ming
、用户_name
、name
、user_name_123456789
正例:用户名称字段:user_name
(名字控制在30个字符以内)
1.2 大写
建议:使用小写字母,统一风格。
反例:PRODUCT_NAME
、PRODUCT_name
正例:product_name
1.3 分隔符
建议:单词间用下划线(_)分隔。
反例:productname
、productName
、product name
、product@name
正例:product_name
1.4 表名
建议:带上业务前缀,便于分类管理。
订单相关:order_pay
、order_pay_detail
商品相关:product_spu
、product_sku
1.5 字段名称
建议:统一命名规则。
状态:status
创建时间:create_time
修改时间:update_time
删除状态: delete_status
外键:主键名+_id
或_sys_no
1.6 索引名
主键:id
或sys_no
普通索引和联合索引:ix_
前缀(ix_product_status
)
唯一索引:ux_
前缀(ux_product_code
)
2、字段类型
选择原则:尽可能选择占用存储空间小的字段类型,提高查询性能。
字符串长度固定:使用char
类型。
字符串长度差异大:使用varchar
类型。
布尔值:使用bit
类型。
枚举字段:使用tinyint
类型。
主键:使用bigint
类型。
金额:使用decimal
类型。
时间字段:使用timestamp
或datetime
类型。
3、字段长度
varchar和char:字符长度。
其他类型:字节长度。
例如:bigint(4)
中的4表示显示长度,实际长度是8个字节。
4、字段个数
建议:每表字段个数不超过20个,避免单表过于复杂,提升维护性。
5、主键
建议:创建主键,使用AUTO_INCREMENT
或外部算法(如:雪花算法)生成主键,减少业务耦合。
6、存储引擎
建议:使用MySQL8默认的InnoDB
存储引擎,支持事务和行级锁,提高数据安全性和性能。
7、NOT NULL
尽量明确字段NOT NULL
,并设置默认值,避免插入数据时出错。
例子:alter table product_sku add column brand_id int(10) not null default 0;
8、外键
建议:互联网系统中不使用外键,避免因外键约束导致的性能问题,转而通过应用层保证数据一致性。
9、索引
建议:创建主键索引、普通索引和联合索引,提高查询效率。单表索引个数建议不超过5个。
数据重复率高的字段(如状态)不建议单独创建索引。
10、时间字段
建议:优先使用datetime
类型保存日期和时间,范围更大,与时区无关。
11、金额字段
建议:使用decimal
类型保存金额,避免浮点数精度丢失。
例如:decimal(10,2)
表示最多8位整数和2位小数。
12、JSON字段
建议:使用MySQL的json
字段类型,方便保存和查询结构化数据,适用于数据值不固定的需求场景。
13、唯一索引
建议:创建唯一索引时,相关字段不能包含NULL
值,避免唯一性约束失效。
14、字符集
建议:使用utf8mb4
字符集,支持更多字符,包括emoji表情,避免使用utf-8
、导致的存储问题。
15、排序规则
建议:根据业务场景选择字符排序规则。常用的有utf8mb4_general_ci
(不区分大小写)和utf8mb4_bin
(区分大小写)。
16、大字段
建议:大字段定义成varchar
类型,避免浪费存储空间。
对于特别大的数据,如合同等,建议使用MongoDB等NoSQL数据库保存,并在MySQL中存储其ID 。
17、冗余字段
建议:适当冗余字段提升查询性能,但需综合评估,避免数据不一致问题。
例如:订单表中冗余存储用户名称。
18、注释
建议:为表和字段添加详细注释,便于理解和维护。
特别是状态字段,需要详细描述各个值的含义,避免后期维护困扰。