每个程序员必看的数据库使用规范

每个程序员必看的数据库使用规范
最新回答
隨遇而安

2026-04-21 05:46:53

程序员在使用数据库时应遵循以下规范,涵盖库表设计、索引优化及SQL编写等方面,以确保数据库性能、可维护性和数据一致性

一、数据库命名规范
  • 库命名规则

    名称长度不超过32字符,仅使用小写字母、数字、下划线,以字母开头。

    格式为业务系统名_子系统名(如order_system_payment),避免使用拼音或缩写。

    创建时显式指定字符集为utf8或utf8mb4(如CREATE DATABASE db_name DEFAULT CHARSET utf8mb4)。

    临时库/表以tmp_开头并附加日期后缀(如tmp_user_20231001),备份库/表以bak_开头并附加日期。

  • 表命名规则

    名称长度不超过32字符,仅使用小写字母、数字、下划线,需与模块强相关(如user_info、order_detail)。

    同一模块的表使用统一前缀(如user_、order_),避免使用关键字(如type、order)。

    显式指定存储引擎为InnoDB,字符集为utf8或utf8mb4,并添加表注释(如COMMENT='用户信息表')。

    大表(超过100万行)的ALTER TABLE操作需经DBA审核,并在低峰期执行。

二、字段设计规范
  • 主键与索引字段

    主键强制命名为id,类型为int unsigned或bigint unsigned,自增且不可更新。

    业务标识字段(如user_id)设为UNIQUE KEY而非主键,避免随机插入导致页分裂。

    核心表需包含create_time和update_time字段,类型为TIMESTAMP,默认值分别为CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP。

  • 字段属性

    优先使用NOT NULL并定义默认值(如DEFAULT 0),避免NULL导致的存储空间浪费和聚合函数偏差。

    中间表(临时结果集)以tmp_开头,备份表以bak_开头,并定期清理。

    示例建表语句:

    CREATE TABLE user_info ( id INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键', user_id BIGINT NOT NULL COMMENT '用户ID', username VARCHAR(45) NOT NULL COMMENT '用户名', create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', PRIMARY KEY (id), UNIQUE KEY uniq_user_id (user_id)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户信息表';
三、索引设计规范
  • 索引类型与命名

    InnoDB表主键必须为自增整数,索引类型强制为BTREE。

    主键索引命名为pk_字段名(如pk_id),唯一索引命名为uniq_字段名(如uniq_user_id),普通索引命名为idx_字段名(如idx_username)。

    单表索引数量不超过8个,优先建立联合索引(如idx_create_time_status),并将区分度高的字段前置。

  • 索引优化建议

    多表JOIN时,被驱动表的连接字段需有索引。

    避免冗余索引(如已有key(a,b),则key(a)需删除)。

    索引列禁止使用函数或表达式(如WHERE LENGTH(name)='Admin')。

四、SQL编写规范
  • 查询规范

    SELECT和INSERT必须显式指定字段名,禁止使用*或省略字段列表。

    DML语句(除静态表外)必须包含WHERE条件,且条件字段类型需与索引一致。

    禁止全模糊LIKE查询(如WHERE name LIKE '%admin%'),需结合等值或范围条件。

    多表JOIN不超过5个表,优先选择小结果集作为驱动表,并避免跨库JOIN。

  • 批量操作与事务

    单次INSERT值不超过5000个,避免主从同步延迟。

    事务内SQL不超过5条,更新语句尽量基于主键或唯一键(如UPDATE t SET ... WHERE id=1)。

    批量操作需控制事务间隔时间(如sleep(0.1)),防止锁等待超时。

  • 排序与分组优化

    减少使用ORDER BY、GROUP BY和DISTINCT,优先通过索引排序(如WHERE a=1 ORDER BY b利用key(a,b))。

    包含排序/分组的查询,WHERE过滤结果集需小于1000行。

五、其他建议
  • 子查询优化:优先拆分子查询为多次查询或使用JOIN替代。
  • UNION使用:推荐UNION ALL替代UNION,且子句不超过5个。
  • 字符集统一:确保应用、数据库、连接字符集均为utf8mb4,避免乱码。

遵循上述规范可显著提升数据库性能、降低维护成本,并减少因设计缺陷导致的线上故障。实际开发中需结合业务场景灵活调整,但核心原则(如索引优化、事务控制)需严格遵守。