- 数据库对象的定义:
数据库对象 = {
表(Table),
属性(Column),
视图(View),
存储过程(Stored Procedure),
函数(Function),
约束(Constraint),
触发器(Trigger),
索引(Index)
}
以下原则适用于所有数据库对象; - 采用26个英文字母(区分大小写)和0-9这十个自然数,加上下划线_组成,共63个字符;尽量避免使用数字;
- 最大长度为30个字符;尽量选择短小而明确的单词或单词组;
- 首字符必须为英文字母,不能为下划线或数字;
- 合成词采用lowerCamelCase记法;尽量减少下划线的使用;
- 所有单词或词组全部采用英文单数形式,既不能使用复数形式,也不能使用汉语拼音;
- 禁止使用SQL保留字,相关列表可参见http://drupal.org/node/141051或http://sqlserver2000.databases.aspfaq.com/what-are-reserved-access-odbc-and-sql-server-keywords.html#top;说易行难,保留字范围很广,例如“name”,“order”, “percent”, “user”等均属保留字,不确定时最好去查表;
- 禁止使用缩略语或首字母缩略词,除非该缩写形式已广泛使用,或者已在数据字典中严格定义;
- 除视图外,禁止使用用来标识数据库对象类型的前缀或后缀,如tbl, idx, usp,cons等;
一、 表的命名
- 前缀的使用:
1.在表名中使用前缀的目的是为了对表进行逻辑上的分组,以方便对表的区分,如果不是出于此目的,禁止使用前缀,如TBL或tbl这样的前缀没有任何意义;
2.按照不同的逻辑层次,可以给表名添加多个前缀,广义的前缀放在前面;如果通过其他方式已经可以得到该表的逻辑分组,就不要在该层次上再使用前缀;
3.前缀属于表名的一部分,同样遵循lowerCamelCase记法;禁止使用下划线连接表名的前缀;
4.前缀一般使用缩写形式,必须在数据字典中注明其准确含义;
5.示例:两个应用:人事系统<hr>和财务系统<fin>共用同一个数据库,其中人事系统又包含两个子系统(假期管理<vac>和评定<>),财务系统也包含两个子系统(工资<pay>和贷款<loan>),则休假申请表可以使用如下的名字:hrVacApplication,而加薪申请表就可以表示为finPayApplication;如果这两个应用各自使用单独的数据库,那么第一层前缀就不应该被使用,相应的表名就变为vacApplication和payApplication,更方便简捷; - 查找表(lookup table)表名前添加主表名作为前缀,如activityStatus,activityType等;
- 连接表(linktable)采用参与连接的各表名的拼接作为表名,拼接顺序采用字母表顺序,如carDriver、doctorPatient,以下情况除外:
1.连接表本身已经有一个自然而标准的名字(定义为实体比定义为联系更确切);
2.当两个表之间存在不止一个连接表时; - 特殊情况处理:
1.禁止使用通用查找表;
2.当参与连接或作为查找表前缀的表名本身已经包含多个单词时,连接表名中可使用下划线作为表名之间的分隔符,如activity_activityType;如果有多个表参与连接,而连接后表名过长,可考虑使用简写形式;
二、
- 禁止使用本表名作为其列名前缀的记法;
- 主码统一使用id作为名字;
- 复合码的命名:如果一个表采用复合码作为其主码,采用“Id”前添加相应描述符的方式对各主属性分别命名,例如,两个字段“moduleId”和“codeId”组成一个复合码,如果在表中你找不到“id”列,就说明该表采用了复合码作为其主码;
- 外码采用父表名+对应的父表列名的命名方法,如car表包含一个指向driver表的外码,其名字就是driverId;如果父表名本身已包含多个单词,为了清晰起见,可使用下划线连接父表名和id,如bestDriver_id;
- 特定数据类型属性的命名:
1.布尔型字段采用类似如下的方式:如isDeleted, hasPermission,isValid等;
2.日期型字段名中通常包含单词“Date”或者以单词“On”作为后缀;时间型字段名中通常包含单词“Time”或者以单词“At”作为后缀;对于持续型时间通常要加上时间单位,如“runtimeHour”或“scheduledMinute”;
三、
- 后缀:视图统一采用“Vw”作为后缀;
- 对于无其它限定条件,只完成表间连接的简单视图来说,可参照连接表的命名规则对其命名,如carDriverVw,bestCar_bestDriverVw等;
- 未尽事宜参照表的命名规则执行;
四、
- 与其他数据库对象不同,存储过程和函数在逻辑上并不绑定于任何表或者列,因此其命名层次与表的命名层次应该是一致的;
- 存储过程和函数的命名采用“动词+名词”的形式,以自然语义阐述其所完成的功能:
1.经常使用的动词有“create, get, update,delete”,但并不局限于此;
2.名词部分可以使用实体名或者表名,也可使用任何其它名字,以准确表达语义为准;
3.例如,addComment, editArticle, removePermission,archiveFileDetail等; - 逻辑分组前缀:和表名一样,存储过程和函数的名称前也可添加逻辑分组前缀,并遵循和表名相同的逻辑分组前缀命名规则,如hrGetNewMember;
- 禁止使用类似前缀,如“sp_”,“xp_”,“dt_”或“fn_”等,一方面完全没有必要,另一方面也会与系统级存储过程或函数产生命名冲突;
五、
- 约束名称采用如下形式:
{表名}{受约束的属性列表}{约束类型简称},其中
表名指出该约束隶属于哪一个表;
受约束的属性列表采用所有受约束属性名称的拼接形式,拼接顺序与属性在表中的顺序一致;
约束类型简称指出该约束的具体类型,如下:Pk代表主码约束,Fk代表外码约束,Ck代表检查约束,Uq代表唯一性约束,Nn代表非空约束;
例如,carIdPk表示在表car的属性id上的一个主码约束,driverCarIdFk表示在表driver的属性carId上的一个外码约束,invoiceCustomerIdCk表示在表invoice的属性customerId上的一个检查约束,等等; - 禁止使用“Cons”或“cons”类型的前缀或后缀;
- 特殊情况处理:
1.如果表名本身已包含多个单词,为了更加清晰,可使用下划线连接表名及其它部分,如约束orderDetailCustomerIdCk也可命名为orderDetail_customerIdCk;
2.如果因受约束属性太多而导致约束名过长的话,可考虑对各属性名使用简写形式,同样,必须在数据字典中注明其准确含义;
六、
- 触发器名称采用如下形式:
{表名}{触发事件类型简称},其中触发事件类型简称包括:
ins代表Insert操作,upd代表Update操作,del代表Delete操作,如productIns等; - 如果一个触发器包含了多个触发事件类型,则将所有的触发事件类型简称拼接起来,拼接顺序采用字母表顺序,如productInsUpd,userNameDelUpd等;
- 如果对同一个表的同一类触发事件定义了多个触发器,则必须在表名和触发事件类型简称之间再加入一个语义描述符,以区分不同用途的触发器,如userValidateEmailAddress
Ins和userMakeActionEntryIns; - 如果表名本身已包含多个单词,为了更加清晰,可使用下划线连接表名及其它部分,如触发器userNameDelUpd也可命名为userName_delUpd;
- 禁止使用“trg”或“tr”类型的前缀或后缀;
七、
- 索引名称采用如下形式:
{表名}{搜索码字段列表}{U/N}{C/N},其中
表名指要建立索引的基本表的名字;
搜索码字段列表采用构成该搜索码的所有字段名称的拼接形式,拼接顺序与字段在表中出现的顺序一致;
U/N指出该索引是否是唯一性(UNIQUE)索引;
C/N指出该索引是否是聚簇(CLUSTER)索引;
例如,"productIdUC"表示product表包含一个建立在id字段上的唯一性的聚簇索引,而orderDetailOrderIdCustomerIdNN表示orderDetail表包含一个建立在orderId和customerId两个字段之上的非唯一非聚簇的索引; - 禁止使用“IDX”或“idx”类型的前缀或后缀;
- 特殊情况处理:
1.如果表名本身已包含多个单词,为了更加清晰,可使用下划线连接表名及其它部分,如索引orderDetailOrderIdCustom erIdNN也可命名为orderDetail_orderIdCustomerIdNN;
2.如果因搜索码包含太多字段而导致索引名过长的话,可考虑对各字段名使用简写形式,同样,必须在数据字典中注明其准确含义;
数据库设计文档规范
表名:
作者:
版本:
日期:
描述:
具体内容:(以表格形式)
附注
1.
2.