内容简介:1、总命名规范1、不得使用数据库保留关键字,以及php/java等常用语言的保留关键字,或者可能成为关键字的单词作为完整命名。(对于一些疑似关键字的单词,可以在后面加一个下划线来避免,例如“key_”)。【附:MySQL保留关键字列表:2、如无特殊说明,名称必须用英文字母开头,采用有特征含义的单词或缩写,单词中间用“_”分割,且只能由英文字母、数字和下划线组成,不能用双引号包含。
一、命名规范
1、总命名规范
1、不得使用数据库保留关键字,以及php/java等常用语言的保留关键字,或者可能成为关键字的单词作为完整命名。(对于一些疑似关键字的单词,可以在后面加一个下划线来避免,例如“key_”)。【附:MySQL保留关键字列表: https://dev.mysql.com/doc/refman/5.7/en/keywords.html 】
2、如无特殊说明,名称必须用英文字母开头,采用有特征含义的单词或缩写,单词中间用“_”分割,且只能由英文字母、数字和下划线组成,不能用双引号包含。
3、除数据库名称长度为1至8个字符,其余(包括表、字段、索引等)不超过30个字符,Database link名称也不要超过30个字符。(30并不是凭空想象出来的,而是参考了Oracle的限制)
2、表名
(建议以2-3字项目名称为前缀开头),紧跟 2-5个字符 (英文字母或数字,但不得全是数字)的 模块名 (必须),最后跟上当前表的含义的单词(1-3个 单词 ,用下划线连接),例如:SQ_SYS_CAR,SQ是项目名称的缩写,SYS是模块名称的缩写,CAR表示当前表的具体含义。
特别强调:项目名称和模块名用简写(建议长度为2-5个 字符 ),而表含义的名称,可简写、也可以不简写,但是都不能超过3个 单词 ,例如下面两个反面例子:
1. ABF_SUPERVISION_USER,问题:模块名称似乎比较长,建议控制在2-5个字符,缩写为 ABF_SUPV_USER;
2. ABF_SYS_USER_MANAGE_ORG_ROLE,问题:除去前缀ABF_SYS_,表含义(USER_MANAGE_ORG_ROLE)超过了3个单词。
3、字段名
a) 表的字段数不超过50个。
b) 类型: 各表之间相同含义的字段,类型定义要完全相同 (包括精度、默认值等);
c) 命名:
1. 字段名无单词数的限制,但是名字的字符长度应该符合上面的“总命名规范”。
2. 字段命名及其注释,要做到 清楚、无歧义 。
举两个实际的例子,
1)有些数据可能会存在多种完全不同类型的状态,例如,例如汽车数据,有启停状态,参保状态,维修状态,年审状态……总之,在有些数据表中,有许多的状态字段。如果没写清楚,例如有个字段 “STATUS tinyint NULL; -- 状态”,这是让人很疑惑的,状态?到底是什么状态?状态的取值有哪些?——如果改成“DELETE_STATUS tinyint default 0; -- 删除状态(1:已删除,默认为0:未删除)”,这样的命名和注释,让人一目了然。
2)再比如“belong_dept -- 所属部门”,这也有歧义,因为部门除了数据唯一ID之外,还有一个部门编码CODE也是唯一的。那到底是存 部门ID,还是 部门编码 CODE?实际情况是,有的人认为存ID,有的却认为存编码。所以,在命名上就应该做到无歧义,如果要存ID,就应该命名为“belong_dept_id -- 所属部门ID”,如果要存部门编码,就应该为“belong_dept_code -- 所属部门编码”。
3. 同一个字段名在一个数据库中只能代表一个意思 。比如phone在一个表中代表“座机号码”的意思,在另外一个表中就不能代表其他意思(比如手机名称、品牌等,否则在A表中phone存的是座机号码,在B表中存的是手机品牌,那就混乱了)
4. 反之,代表同一个意思的字段,在各个表中都用相同单词表示 ,例如电话号码字段,在A表中叫telephone,在B表中叫phone,在C表中叫mobile,这样就很混乱。
特殊情况:如果有多个字段时,可以加前缀或后缀区分,代表 复数 含义时,单词后可以加s,例如user_ids。比如“电话号码”,在A表字段中名称为tel,在B表中也只能叫做tel(但是如果B表中有多种电话号码,可以加 后缀 ,例如 保卫部 tel_bw,科技部 tel_kj,综合部 tel_zh)。
5. 对于多个表关联的 外键 字段,例如 create_user_id,关联的是 user表里面 id 字段,建议的命名规则是 “ 关联表名(无需前缀)+"_"+关联字段名 ”,也就是说,单词是根据表和字段名而来的,不是凭空随便想出来的。例如这个 create_user_id,create_是前缀,user_代表 abf_sys_user表,id代表abf_sys_user表的id字段。再比如create_user_dept_code,user_是abf_sys_user表的后缀,dept_是abf_sys_dept表的后缀,code是abf_sys_dept表的code_字段。
综合第4、5点,再举一例:有一个部门表abf_sys_dept,里面有一个部门编码字段code_,如果有一个表需要保存 "责任部门编号" 和 "创建人所属部门编号",按照规范,这两个字段可以命名为:resp_dept_code 和 create_user_dept_code。
4、主键名
前缀为PK_。以PK_+表名+主键字段名构成。如果复合主键的构成字段较多,则只包含第一个字段。表名可以去掉前缀。例如PK_SYS_CAR_ID。
5、外键名
前缀为FK_。以FK_+ 外键表名 + 主键表名 + 外键字段名构成。表名可以去掉前缀。例如FK_SYS_USR_SYS_CAR_ID。
6、普通索引
前缀为IDX_。以IDX_+表名+索引字段名构成。如果复合索引的构成字段较多,则只包含第一个字段,并添加序号。表名可以去掉前缀。例如IDX_SYS_CAR_DIN。
7、主键索引
前缀为IDX_PK_。以IDX_PK_+表名+索引字段名构成。表名可以去掉前缀。例如IDX_PK_SYS_CAR_ID。
8、唯一索引
前缀为IDX_UK_。以IDX_UK_+表名+索引字段名构成。表名可以去掉前缀。例如IDX_UK_SYS_CAR_DIN。
9、外键索引
前缀为IDX_FK_。以IDX_FK_+表名+外键字段名构成。表名可以去掉前缀。例如IDX_FK_SYS_CAR_ID。
10、Oracle序列
前缀为SEQ_。以SEQ_+“序列业务名称”构成。如果“序列业务名称”就是某个表名,则使用表的全名,不可去掉前缀。例如SEQ_SQ_SYS_CAR。
二、表设计规范
-
采用UTF8字符集。
-
对于数据量可能很大的表(超过2000万),采用分库/分表/分区表,横向拆分控制单表容量。
-
必须为表、字段等添加注释。
-
遵守数据的设计规范3NF 规定。
-
表内的每一个记录都只能被表达一次。
-
表内的每一个记录都应该被唯一的标识(有唯一键)。
-
表内不应该存储依赖于其他键的非键信息。
-
反范式化冗余字段使用规范 考虑具体使用场景,当 SQL 关连查询比较频繁,或涉及到4张以上表时可考虑采用冗余字段。
-
必须设置唯一主键,尽量使用自增id作为主键。
-
建议主键为数字类型,且为递增顺序,主键不表示任何业务含义,严禁数据量大的表使用UUID/MD5作为主键。
-
不使用数据库外键,由程序保证。
-
MySQL:
-
使用InnoDB存储引擎。
-
数据库和表字符集类型统一(utf8mb4 -- UTF-8 Unicode),排序规则统一(utf8mb4_unicode_ci);建表语句中强制指定字符集;
-
自增字段类型必须是整型,使用 BIGINT类型。并且自增字段必须是主键或者是主键的一部分。
三、字段设计规范
1、凡是可能被索引的字段,必须定义为NOT NULL,可以设置default值;
2、非负值的数字统一使用unsigned(无符号)类型存储 ??
2、大对象字段
-
通常情况下,禁止使用LOB类型保存大文本、图片和文件,建议使用其他方式存储(例如文件系统,数据库只保存其地址信息)。
-
MySQL:尽量不要使用TEXT数据类型,mysql的varchar类型支持65535字节,满足大多数场景,仅当字符数特别大时,才考虑text类型;
附——大对象字段处理方法:
-
将大对象字段从主表中拆分出来单独存放,与原表主键单独存储在另外一个表里;
-
如果是Oracle 12g之前的版本,VARCHAR2最多支持4000,如果文本内容只是偶尔可能超过4000,但是不会超过8000,那么可以用两个VARCHAR2字段来存储,使用的时候将这两个字段拼接起来就行了。
-
如果有方便的文件系统,可以将大文本或附件,保存在文件系统中,数据库中只保存其位置和路径信息即可。
3、禁止使用enum,对于boolean类型或者表示简单状态的字段,MySQL用tinyint,Oracle用NUMBER(1)
-
建议字段not null,根据业务要求来设置默认值(例如默认为0)。
-
对于boolean类型,以1代表是(true), 0 代表否(false)。
-
对于状态类型,注释中应该注明每一种状态的含义,例如“0:编辑中,1:审核中,2:已完成”。
4、数字、小数类型
-
对于数字、小数类型,不得使用VACHAR等字符串类型来保存,应该使用相应精度的数字、小数类型。
-
尽量确保数值型列都有默认值
-
对于Oracle,确定好Number的精度。
-
对于MySQL,选好数字类型:TINYINT>SMALLINT>MEDIUMINT>INT>BIGINT>DECIMAL(存储空间逐渐变大,而性能却逐渐变小),超过tinyint(256)但不超过65536的使用smallint;当该字段超过42亿时,才使用bigint;
-
使用DECIMAL 代替 FLOAT 和 DOUBLE 存储精确浮点数??why?
5、时间类型标准
对于Oracle,有两种时间类型:DATE和TIMESTAMP,DATE的精度只保存到秒,例如“2013-11-02 11:16:36”,而TIMESTAMP精度更高可以保存小数秒,例如“2013-11-03 11:16:36.000000” 。有时候,DATE只保存到秒,不足够区别出两个事件哪个先发生,这时建议使用TIMESTAMP类型。
MySQL:存储年使用year类型,存储日期使用date类型,使用精确时间戳(精确到秒)尽量使用timestamp类型,因为timestamp使用4字节,datetime使用8字节,它们的区别:TIMESTAMP值不能早于1970或晚于2037('1970-01-01 00:00:01' UTC to '2038-01-19 03:14:07' UTC)。
5、必须使用int unsigned存储IPV4;
6、一些常见字段的命名统一
为了规范命名,并结合一般命名习惯,指定如下几个字段定义(以Oracle为例):
ID 编号 NUMBER(22)(Integer)
Create_By 创建人 NUMBER(22)(Integer)
Create_Time 创建时间 TIMESTAMP --默认为系统当前时间
Update_By 修改人 NUMBER(22)(Integer)
Update_Time 修改时间 TIMESTAMP --默认为系统当前时间
其他参考命名:
Code_ 编码 VARCHAR2(30)
Level_ 层级 NUMBER(1或2)
Delete_Status 删除标志 NUMBER(1) --1:表示已经删除,默认为0:表示未删除
Description_ 描述或备注 VARCHAR2(200)
四、索引规范
复合索引的字段数不能超过5个。
单表的索引数量尽量控制在5个以内。
联合索引的字段排列顺序以去重后字段的数值的个数大小 排序 先后顺序。比如表mk_task有id,name,id有50000个独立值,name有5000个独立值,那么,顺序是id在name前面,建立的索引是idx_id_name。
Order by、distinct、group by后的字段尽量建立索引。
update、delete的where尽量使用有索引的字段或主键。
超过20字节的varchar字段建议用前缀索引,禁止对字符串长度超过50个字符的列创建索引。
不建议在低基数列上创建索引,例如“性别”列;
合理创建联合索引(避免冗余),(a,b,c) 相当于(a)、(a、b)、(a、b、c)。
长文本类型字段(例如Text)不能使用索引。
五、其他
1、主键ID
建议使用分布式全局唯一递增ID,比如类snowflake算法,很多大公司都在用,有许多成熟的案例,而且百度、腾讯、美团都把自己的ID生成 工具 开源了。
禁止使用存储过程、视图、事件、触发器、数据库自带的分区表。
临时库、表名必须以”tmp_日期”为后缀,如当日创建多个,则在日期后增加数字后缀;
备份库、表必须以”bak_日期”为后缀,如当日创建多个,则在日期后增加数字后缀;
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 数据库开发规范-通用版
- .NET 多种数据库访问通用库 DbProviderFactory 更新
- Bouyei.DbFactory(多种数据库通用sdk)优化
- .net 多种关系型数据库通用连接池升级
- 通用数据库管理工具 DBeaver 5.0.2 发布
- 通用数据库管理工具 DBeaver 5.0.3 发布
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
未来世界的幸存者
阮一峰 / 人民邮电出版社 / 2018-6-1 / 39.00 元
本书为阮一峰博客文集,主要收录的是作者对技术变革的影响的一些思考,希望能够藉此书让读者意识到世界正在剧烈变化,洪水就在不远处,从而早早准备出路。本书适合所有乐于思考的读者。一起来看看 《未来世界的幸存者》 这本书的介绍吧!