第一家公司数据库开发规范

第一章:SQL Server编程规范

一:大小写风格

全部使用小写,包括关键词,不要出现任何大写字母.

二:缩进风格

1:程序块采用缩进风格书写,保证代码清晰易读,风格一致。缩进格数统一为 4 格。
2:必须使用空格键,不允许使用TAB键。
3:注释必须保证左对齐。
4:每行不要超过80个字符,以免在某些编辑器中发生意外换行的情况.
5:同一条语句占用多于一行时,每行的第一个关键字应当右对齐。(建议)


三:空格及换行

1:不允许把多个短语句写在一行中,即一行只写一条语句。
2:相对独立的程序块之间、变量说明之后必须加空行。
3:双目运算符前后、操作符之后、间隔符、左括号之后以及右括号之前应以空格分隔。
4:对两个以上变量赋值时,分多行写,每一行对一个变量赋值,这样便于注释。
5:定义两个以上变量时,分多行写,定义每一行对一个变量,便于注释。
6:IF 语句后面的条件必须使用括号括起来。if语句中用begin...end结构,阅读起来方便些。


四:其它

1:减少控制语句的检查次数,如在ELSE (IF...ELSE)控制语句中,对最常用符合的条件,尽量往前被检查到
2:从表中同一笔中记录获取的字段值,须使用同一SQL语句中得到,不建议分多条SQL语句获得值.
3:表名别名要简短,但意义要尽量明确。通常,使用小写的字母作为别名,使用 as 关键字指定表或字段的别名。
4:当一个 T-SQL 语句中涉及到多个表时,始终使用表名别名来限定字段名。这使其他人阅读起来更清楚,避免了含义模糊的引用。


五:命名规范

1:所有标示符、对象名的长度不得超过30个字符。(这是为了将数据库能兼容Oracle,Oracle变量名标示符不能超过30个字符)

2:所有用户自定义的数据库对象名称统一使用形如“小写首字母+下划线+混合拼写”的格式,其中小写首字母表示对象类型。
具体规则参见下表。


用户表         t_
存储过程       p_
函数           f_
触发器         tr_
视图           v_
链接服务器     lnk_
字段名         无前缀

注:如果同一数据库下有不同的业务模块,可在大前缀后再跟业务名.
   如 t_msg_userinfo  (msg表示业务名)


说明:
A.Sql Server系统对象多以sys开头,因此编码时禁止以sysObjectName形式为用户创建的对象命名。
B.Sql Server系统存储过程以sp开头,建议用户自定义的存储过程不要与此相同。

3:所有用户定义的存储过程或函数中使用的变量、常量、异常等统一采用小写首字母+简短单词或缩写的格式,
其中的小写首字母代表变量的类型,具体参见下表:(补充数据类型)

4:用正确的反义词组命名具有互斥意义的变量或相反动作的函数等。 
示例:
begin     -  end        开始   - 结束
start     -  finish     启动   - 完成
first     -  last       第一个 - 最后一个
prior     -  next       前一个 - 后一个
add       -  remove     增加  -  删除
create    -  destroy    创建  -  析构
get       -  set        获取  -  设置
increment -  decrement  增量  -  减量
lock      -  unLock     加锁  -  解锁
open      -  close      打开  -  关闭


5:标识符的命名要清晰、明了,有明确含义,同时使用完整的英文单词或大家基本可以理解的缩写,避免使人产生误解。不允许使用除小写字母、数字、_、@以外的其他字符。

6:命名中若使用特殊约定或缩写,则要有注释说明。

7:使用有意义、易于记忆、描述性强、简短及具有唯一性的英文单词。不允许使用除小写字母、数字、_、@以外的其他字符。不允许有个人风格。 不允许使用汉语拼音。

8:对于变量命名,禁止取单个字符(如i、j、k...),建议除了要有具体含义外,还能表明其变量类型、数据类型等。形如i、j、k的变量只允许作为局部循环变量。 

9:所有的标示符、对象名命名不得使用保留字、关键字。 

10:仅允许对对有长度、精度限制的类型定义自定义类型。


六:注释规范

1:一般情况下,源程序有效注释量必须在30%以上。

2:在数据库脚本文件头部应进行注释,注释必须列出:生成日期、作者、内容、功能、修改日志等,头文件的注释中还应有函数或过程功能简要说明、入口参数、出口参数。

3:函数或过程头部应进行注释,列出:函数的目的/功能、输入参数、输出参数、返回值、各返回值表示的意义, 调用关系(函数、表)等、取值范围。 

4:对存储过程的任何修改,都需要在注释最后添加修改人,修改日期及修改原因等信息.

5:边写代码边注释,修改代码同时修改相应的注释,以保证注释与代码的一致性。不再有用的注释要删除。 

6:注释的内容要清楚、明了,含义准确,防止注释二义性,在注释中不允许使用缩写。

7:注释应与其描述的代码相近,对代码的注释应放在其上方或右方(对单条语句的注释)相邻位置,不可放在下面,如放于上方则需与其上面的代码用空行隔开。不允许在一行代码或表达式的中间插入注释。

8:注释与所描述内容进行同样的缩进。 

9:对变量的定义和分支语句(条件分支、循环语句等)必须编写注释。 

10:在程序块的结束行右方加注释标记,以表明某程序块的结束。

11:对于单行注释使用“--”,对于多行注释可考虑使用“/**/”。

12:语句、参数、变量后的注释采用左对齐方式

13:通过对存储过程、变量、结构等正确的命名以及合理地组织代码的结构,使代码成为自注释的。 

14:在代码的功能、意图层次上进行注释,提供有用、额外的信息。 


七:基本语法规则

1:使用 SQL-92 标准句法。

2:决不要依赖于 SELECT 语句会按任何特定顺序返回行。如果有顺序依赖关系,需要使用ORDER BY 子句指定顺序。

3:不要在 T-SQL 代码中使用双引号。字符常量应该使用单引号。

4:尽量使用表变量来代替临时表。SQL Server 2000以上版本中,表变量大大优于临时表。

5:避免使用“未声明的”功能,例如系统表中未声明的列、T-SQL 语句中未声明的功能或者未声明的系统存储过程或扩展的存储过程。

6:避免在业务代码使用系统存储过程,如xp_cmdshell。

7:避免隐式的数据类型转换。需要类型转换的地方一定要使用函数进行显示转换。

8:判断变量是否为空,应使用 is null 或 is not null 进行比较。对于如果可能为空的变量使用,需要先判断是否为空,或者使用 isnull 函数进行空值的转换。

9:确保变量和参数的类型和大小与表数据列相匹配。

10:代码中不允许出现“*”的用法,必须用实际的字段名代替。

11:避免隐式解析对象名称,确保所有对象都归 dbo 所有。

12:连接查询超过三个表的语句应当通过存储过程的方式来实现,提高效率。使用存储过程可以避免编译的成本


八:性能规则

1:为了提高性能,应优先使用连接,然后使用子查询或嵌套查询。

2:避免对where子句中的字段使用函数。避免对where子句中的字段进行计算。

3:尽量使用where子句替换having子句,having只对统计结果进行过滤。

4:在长度允许范围内,使用integer代替numeric

5:用case语句合并多重表扫描

6:对于比较复杂的语句,或者涉及数据量较大的表的语句,可以通过做查询计划检测、调整语句性能。

7:like子句尽量前端匹配。

8:尽量不使用 "<>"

9:分解复杂查询,用常量代替变量

10:使用IDENTITY自动管理序例的产生
   如果多表张需要共同identity型字段,可以创建一个含有identity类型字段的小表,
   由sql server自动管理sequence的产生,通过ident_current('table_name')返回为任何会话和任何作用域中的指定表最后生成的标识值。


九:存储过程、函数规范

1:所有的存储过程都应在开始时设置 
   set nocount on
   此标准同样适用于触发器。

2:共用代码段可以考虑写成一个子过程(或函数),对于控制流语句,不论哪个条件最后都会执行的语句应该放在控制流结束之后执行,这样是为了节约代码,便于维护


3:检查输入参数的有效性由调用者来完成,存储过程内部不检查参数有效性(约定)。

4:确保使用到所有变量和参数。不允许存在不会使用到的变量、参数。

5:代码中声明与表的字段相对应的变量时,应保证变量名和字段名相同,数据类型与数据长度相同;
   对已有定义自定义类型,必须使用自定义类型。这样规定的目的是增强可读性。

6:存储过程中变量的声明应集中在AS和BEGIN关键字之间,不允许在代码中随处定义变量(重要)。

7:始终指定字符数据类型的长度,并确保允许用户可能需要的最大字符数,因为超出最大长度的字符会丢失

8:如果存储过程中都会用到getdate()置值,那么就在程序开始时定义一个赋值为getdate()的供整个存储过程使用的变量.

9:对所有变量和输出参数都要做初始化。

10:返回值代码含义必须要在接口设计文档和代码注释中说明,并保持一致。

11:存储过程中每个失败出口均应返回不同的自定义错误码。

12:存储过程的代码必须放在begin...end块中。



十:事务处理

1:诸如删除/清空临时表之类对数据完整性要求不高的操作,可以不放在事务中。

2:在某些特殊情况下,为了提高代码效率,可以不使用事务控制,但必须通过增加其他的容错处理以保证业务逻辑的正确性。

3:为保证数据的完整性,在存在显式事务的函数中,必须加上SET XACT_ABORT ON
   加上SET XACT_ABORT ON ,在事务内,如果不是语法错误,在执行出错后,事务将不再往下执行,整个事务将自动回滚.
   这样就无需在每条语句后加上 if @@error <> 0 的判断。


4:尽量避免使用嵌套事务


十一:游标处理

1:不推荐使用复杂或动态的游标. 应当使用可代替游标的方法。

2:使用游标推荐使用定义游标变量的方式,而不要使用常规的declare cur cursor for select ...
    declare @cur cursor
    declare @phonenumber varchar(18)
    set @cur = cursor read_only forward_only for select top 10 phonenumber from userinfo with(nolock)
    open @cur
    fetch next from @cur into @phonenumber
    while @@fetch_status = 0
    begin
        print @phonenumber
        fetch next from @cur into @phonenumber
    end

    使用这种方式定义的游标,需要显式打开,但在离开变量作用域时,将自动关闭(close @cur)和删除引用(deallocate @cur).当然也可以显式关闭和删除引用.



第二章:开发设计规范

1:优化数据库从设计开始

2:表设计原则
    规则1:如果某个字段值有多个含义,需要在相应的字段说明里说明各个值的含义。包括设计文档和脚本。

    规则2:每个表都要设置主键。如果无现成的字段可用作主键,建议添加一个自增长的整型字段。 
       强烈建议主键为一个字段。

    建议3:尽量通过业务代码保证数据的一致性,不要过多依赖主外键来保持数据一致性, 主外键关系会降低更新及插入数据的性能。

    建议4:对于重要的数据,建议在最后加一个writetime字段,定义为 smalldatetime not null default(getdate())。

3:不要过多使用触发器,尽量不能使用触发器,这会导致数据库难以维护。

4:索引原则
    规则1:创建索引必须有明确的使用目的,不允许创建无用的索引。

    规则2:频繁更新的字段不创建Clustered索引。

    规则3:索引字段不宜过多。对所选的每一列,可指出索引是按升序还是降序组织列值。

    规则4:不要在过长的字符型列上建立索引,如长度超过50的varchar字段。
       这可以避免索引占用过多的空间。

    规则5:在不同的设备上创建文件或文件组,并将索引和表分别建在不同的文件组上。

    规则6:不需要将聚集主键字段建在任何非聚集索引中。

    规则7:频繁更新的索引应该每天使用 dbcc indexdefrag 工具整理索引碎片。

你可能感兴趣的:(第一家公司数据库开发规范)