【库表设计】——心得持续更新
数据库表通用设计原则
【强制】bigint unsigned id 显式主键id,勿用复合主键,命名统一为:id
【强制】bigint unsigned data_id 分片键id,存在数据库分片可以使用
【强制】varchar(11) created_by 操作人
【强制】int(1) unsigned deleted 逻辑删除标记.默认值0,删除值1
【强制】timestamp create_time 默认值 CURRENT_TIMESTAMP 额外值 DEFAULT_GENERATED
【强制】timestamp update_time 默认值 CURRENT_TIMESTAMP 额外值 DEFAULT_GENERATED on update CURRENT_TIMESTAMP
【强制】关于状态字段根据业务含义命名为: state、status
【强制】主键索引名为 pk_字段名
【强制】唯一索引名为 uk_字段名
【强制】普通索引名则为 idx_字段名。
【强制】禁止在在低基数上创建索引,如性别,是否启用
【强制】避免过度索引:索引过多增加更新语句的消耗
【强制】为 WHERE、JOIN、ORDER BY、GROUP BY 涉及的高频查询字段建立索引。
【强制】理解最左前缀匹配原则复合索引 (a, b, c) 可以被 WHERE a=?, WHERE a=? AND b=?, WHERE a=? AND b=? AND c=? 利用,但不能被 WHERE b=? 或 WHERE c=? 利用。
【强制】不得使用外键与级联,一切外键概念必须在应用层解决
【强制】不得使用存储过程
【强制】数据库名、表名、字段名统一使用小写字母, _ 分割
【强制】表和字段必须加注释!
【强制】一律都是软删除
【强制】单表不宜过大:千万以下最好
【强制】对于大表需要进行归档处理,合理利用软删除
【强制】表名应具有业务含义且简洁:
【强制】生产环境 DDL 操作(尤其是 ALTER TABLE)需评估风险,选择低峰期执行,并有回滚预案。执行 ALTER TABLE会进行锁表
【强制】所有字段尽可能使用 NOT NULL,为后续添加索引以及空值处理提供保障,NULL在传递过程中会可能被转换为"NULL"串,""、NULL、"null"、"NULL"等问题造成空值查询困难
【强制】时间字段优先使用 TIMESTAMP 或 DATETIME,TIMESTAMP 范围小(1970-2038),但存储空间小(4字节),且自动时区转换。DATETIME 范围大(1000-9999),存储空间大(8字节),不涉及时区。避免使用 INT 存储时间戳(虽然节省空间,但可读性差,易出错)。
【强制】当字段为外键时,字段名为:关联表_id, 注释需要在字段注释基础上,换行加上 #关联表表名来说明关联的哪张表。
【建议】遵循第三范式 (3NF) 作为起点: 减少数据冗余,保证数据一致性。但在性能要求极高的场景下,可以进行有目的的反范式化(如添加冗余字段、宽表)以换取查询性能。
【建议】监控慢查询日志:
【禁止】禁止使用 ENUM 和 SET 类型

浙公网安备 33010602011771号