数据库和表设计规范
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字段.
在应用的查询中,一律不使用 * 作为查询的字段列表。有哪些字段必须明确写明。