nisbos


数据库设计规范

<h4>1、数据库表设计规范</h4> <h5>1.1、表命名规则</h5> <p>1、表命名规则:子系统名(2-3位英文缩写)<em> + 子模块名</em> + 自定义名称,如:OA系统(OA)下的通知收发记录,命名为oa_notify_record,表名长度控制18位内。不要用数据库保留字来命名表名。每个表需要加入表注释。说明这个表的用途,与其他表的外键关联情况等。 子系统名定义如下:办公自动化-OA,系统管理-SYS,工作流-ACT,生产制造-MES,CBOARD - CBO等。</p> <p>2、视图命名规则:以“vi<em>”+ 子系统名(2-3位英文缩写)</em> + 子模块名_ + 自定义名称,如:OA系统(OA)下的通知收发记录,命名为vi_oa_notify_record,长度控制18位内。</p> <p>3、存储过程命名规则:以“sp<em>”+子系统名(2-3位英文缩写)</em> + 子模块名_ + 自定义名称,“sp”是存储过程(Store Procedure)的缩写,如:OA系统(OA)下的通知收发记录,命名为sp_oa_notify_record,长度控制18位内。建议不使用存储过程,问题难排查。</p> <p>4、触发器命名规则。以“trg_”+“表名”来命名,“trg”是Trigger的缩写。一般一个表只建立一个触发器。触发器添加原则。能用别的方式解决的,就尽量不要编写触发器,因为太多的触发器,系统运行时,会导致意料不到的问题或错误,问题比较不好控制和跟踪。</p> <p>5、序列命名规则:以“seq_”+&quot;表名&quot;,“seq”是Sequence的缩写。</p> <p>6、表、试图、存储过程、触发器、序列的名称,字段名,统一用小写</p> <h5>1.2、字段定义规范</h5> <p>1、字段命名规则:有现实意义的英语单词或缩写为基础,能一目了然看明白该字段意思为佳。每个单词的首字母大写,其他字母小写,不以数字和“<em>”开头;字段用多个单词连接时用“</em>”间隔开。不要用数据库保留字来命名字段名。字段名长度控制在18位内。</p> <p>2、字段名和数据类型定义的规范如下: 1) 多个单词之间用下划线“_”隔开。 2)与编号有关的字段名以NO作为后缀,varchar类型,长度32。 3)与名称有关的字段名以Name作为后缀;中文名称的字段名以name结束,不带语言标记符,默认是中文;varchar类型,长度64。 4)与类型有关的字段名以Type作为后缀;与状态有关的字段名以Status作为后缀;这些与枚举类型有关的字段,统一定义为Char类型;长度则以枚举数据的个数来判断,如果枚举数据个数明确已经超过10个或以后有可能会超过10,那么长度定义为2,对于不足2位的枚举值,则前补“0”,补足两位;如果枚举数据个数明确不会超过10个,那么长度定义为1即可; 5)与标记或逻辑判断有关的字段以Flag作为后缀,Char类型,长度1; 6)与地址有关的字段名以Addr作为后缀,单独地址字段则以Address命名;varchar类型,长度255; 7)邮政编码字段名为post_code;varchar类型,长度 32; 8)密码字段名为password;varchar类型,长度64; 9)与时间有关的字段名以_time作为后缀,datetime类型;</p> <p>3、公用字段(创建人、创建时间,修改人、修改时间,逻辑删除标志),对通用的表字段,可以按下面模板去创建。</p> <pre><code class="language-sql">`user_id_create` bigint(20) DEFAULT NULL COMMENT '创建用户id', `gmt_create` datetime DEFAULT NULL COMMENT '创建时间', `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', `user_id_modify` bigint(20) DEFAULT NULL COMMENT '更新者', `remarks` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '备注信息', `del_flag` char(1) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT '0' COMMENT '删除标记'</code></pre> <p>4、代码有一个基类(BaseDo.java),它跟数据库通用字段对应,编写代码实体类模型时,只需继承BaseDo即可继承对应公用字段</p> <pre><code class="language-java">public abstract class BaseDo implements Serializable { private static final long serialVersionUID = 1L; /** * 创建者 */ private Long userIdCreate; /** * 创建时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date gmtCreate; /** * 更新者 */ private String userIdModify; /** * 更新时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date gmtModified; /** * 备注 */ private String remarks; /** * 删除标志 */ private String delFlag; /** * 搜索值 */ private String searchValue; } </code></pre> <h5>1.3、表主外键定义</h5> <p>1、主键标识为:PK_OA_子模块名_五位缩写;如PK_OA_NOTIFY_OBJ01。 2、外键标识为:FK_OA_子模块名_五位缩写;如FK_OA_NOTIFY_OBJ01。</p> <h5>1.4、表索引定义</h5> <p>1、添加表索引的原则。在建立表主键时,数据库默认会以主键字段建立一个唯一索引,所以对表数据的操作尽量都通过主键来进行;在有其他特别需要或性能要求时,才在表别的字段上建立唯一索引或一般索引;不要在会保存NULL空值的字段建立索引。索引不在多,贵在精,够用就行;否则反而降低了数据操作的性能。 2、主键索引和外键索引命名规范。这两个索引命名与主键名和外键名同一名称,不做特别命名。 表其他索引命名规则。唯一索引以“UNIQUE_”+“表名”+“<em>2位序列号”来命名;其他一般索引以“IX</em>”+“表名”+“_2位序列号”来命名,“IX”是Index的缩写;最后加的两位数字序列号,从01开始。索引名总长度不超过18位,若超出,则将“表名”中的自定义表名部分改成简写。</p> <h4>2、数据库编程规范</h4> <h5>2.1、SQL编写规范</h5> <p>根据系统的架构设计,SQL语句基本上在MyBatis的<em>.xml文件中编写,SQL关键字(如SELECT, UPDATE, INSERT, FROM等)统一大写,数据库表名和字段名也统一大写。 注释说明的文字在</em>.xml文件里用<!-- -->来注释,不要嵌入到SQL语句中。 为了提高SQL可读性和执行性能,列出以下注意事项: 1.不要用“SELECT <em> ”,SELECT语句后面尽量写出具体的字段名;用SELECT COUNT(主键ID)来代替SELECT COUNT(</em>)。 2.减少数据库访问次数,能在一个SQL语句里执行完成,就不要分成多个SQL语句,除非有性能上的问题。 3.当SQL语句涉及到多个表时,每个表都取一个别名(可以以A/B/C等作为别名),别名以1~3个英文字母命名为佳,不要太长。在每个表的列名前加上表别名前缀,避免列名出现歧义。给列名取别名时,不要取重复了,也不要取到数据库保留字。 4.SELECT涉及到多表查询时,注意FROM后表的顺序,一般FROM后紧跟着大表,然后才是数据量比较少的小表,以小表作为基础表。 5.尽量不要用NOT IN子查询,如果确实有这方面的需要,也要用NOT EXISTS来代替NOT IN。 6.WHERE语句中,检索条件的字段尽量是已经建立索引的字段,利用上索引才能提高执行性能,避免进行全表查询。即使引用的字段已经有建立索引,但对该字段不正确的引用,也会导致SQL解析器不走索引,而走全表查询,这一点要非常注意。以下是注意要点:对索引列不要使用函数或进行计算;不要在索引列上使用NOT或“!=”布尔计算,因为索引只能告诉你什么存在于表中, 而不能告诉你什么不存在于表中;不要去改变索引列的数据类型。 7.对于复杂的SQL,在编写完成后,尽量在SQL执行计划中分析一下,查看对索引的使用情况,SQL的性能是否有问题。</p> <h5>2.2、分布式数据库查询(待补充)</h5> <p>1、不同模块间的关联查询,禁止使用join 2、热点数据的复杂关联查询禁止使用join,搬到业务层上做处理</p> <p>参考:<a href="https://kangroo.gitee.io/ajcg/#/sql">https://kangroo.gitee.io/ajcg/#/sql</a></p>

页面列表

ITEM_HTML