db_model_rules.md 2.82 KB

数据库和表设计规范

1. 数据库设计规范

1.1 命名规范

  • 对象名(表、列、函数、视图、序列),一律只使用小写字母,下划线、数字。不以数字开头,不使用保留字。对象名不体现复数的概念,所以名字不以s/es结尾。

表定义示例: ev_return_good / ev_user

  • 表的字段列名,一律只使用小写字母、下划线、数字。

  • 表达是与否概念的字段,必须使用 is_xxx 的方式命名,数据类型是 unsigned tinyint ( 1 表示是,0 表示否)。

  • 删除标志字段,统一使用 del_flag。

  • 命名禁止两个下划线中间只出现数字

  • 创建索引以idx_开头,创建唯一索引以uk_开头.

  • 临时表以tmp_开头。

  • 数据库名以应用或者部门简写为前缀,例如qi_,ev_等

1.2 SQL设计规约

  • 表默认使用InnoDB,表字符集默认使用utf-8

  • 所有表必备三字段: xx_id | created_at | updated_at字段。其中created_at/updated_at字段的nullable=yes

  • 所有的表必须定义主键,主键定义规则如下:

ev_site => site_id

ev_site_brand => sb_id

ev_spc_discount => sd_id

ev_spc_delay => sd_id

  • 外键的关联字段设计,关联的字段一定要相同,以group和site为例:

ev_group => group_id | group_name | ...

ev_site => site_id | group_id | site_name | ...

  • 表字段被索引列必须定义为not null,并设置default值

  • 除非特殊需要,才将字段定义为null, 否则,将字段定义为非null, 并设置默认值。

  • 所有表主键都是int并自增性,禁止使用varchar类型作为主键。

  • 小数类型为 decimal,禁止使用 float 和 double。

  • varchar 是可变长字符串,不预先分配存储空间,长度不要超过 5000,如果存储长 度大于此值,定义字段类型为 text,独立出来一张表,用主键来对应,避免影响其它字段索 引效率。

  • 每个表字段都需要有注释。如果是枚举类型的字段,必须存在每种枚举的注释。

  • 表修改时必须有修改日志记录。

  • 业务上具有唯一特性的字段,即使是组合字段,也必须建成唯一索引。

  • 超过三个表禁止 join

  • 在 varchar 字段上建立索引时,必须指定索引长度,没必要对全字段建立索引,根据 实际文本区分度决定索引长度即可。

  • 以下设计规约来自阿里:

    • 不要使用 count(列名)或 count(常量)来替代 count(*)。count(*)会统计值为 NULL 的行,而 count(列名)不会统计此列为 NULL 值的行。
    • 使用 ISNULL()来判断是否为 NULL 值。注意:NULL 与任何值的直接比较都为 NULL
    • 不得使用外键与级联,一切外键概念必须在应用层解决。
    • 禁止使用存储过程,存储过程难以调试和扩展,更没有移植性。
    • in 操作能避免则避免,若实在避免不了,需要仔细评估 in 后边的集合元素数量,控 制在 1000 个之内

1.4 Model定义规约

  • Model继承自自定义的BaseModel.

  • Model的命名是表名去除前缀和下划线的大驼峰写法

  // 表名 : ev_group_discount
  class GroupDiscount extends BaseMode { }
  • 除了作为基类的Model如BaseModel, 其它表映射的Model都需要定义\$table\$primaryKey 变量
  class APIManager extends BaseModel {
     protected $table = 'api_manager';
     protected $primaryKey = 'am_id';
  }
  • 所有的插入操作,必须更新created_at / updated_at 字段

  • 所有的更新操作,必须更新updated_at字段.

  • 在应用的查询中,一律不使用 * 作为查询的字段列表。有哪些字段必须明确写明。