【分享-Transact-SQL编程规范】解决方案

【分享-Transact-SQL编程规范】
忽然发现电脑里有这么份资料.感觉不错 ~·

Transact-SQL编程规范
 
1.  概述
1.1. 基本原则
以大小写敏感编写SQL语句。
尽量使用Unicode 数据类型。
优先使用连接代替子查询或嵌套查询。
尽量使用参数化SQL查询代替语句拼接SQL查询。
禁止使用[拼音]+[英语]的方式来命名SQL对象或变量。
尽量使用存储过程代替SQL语句。
 
1.2. 基本规范
建议采用Pascal样式或Camel样式命名数据库对象。
大写T-SQL语言的所有关键字,谓词和系统函数。
 
2.  命名规范
在一般情况下,采用Pascal样式或Camel样式命名数据库对象,使在开发基于数据库应用程序的时候通过ORM工具生成的数据访问代码不需要调整就符合程序开发语言(比如C#)命名规范。另外,关系型数据库同Xml结合得越来越紧密,规范的命名越来越重要。
在实际数据库开发过程中,如果需求方已经提供数据库设计方案,建议以提供的方案为准;在原有数据库上进行升级开发时,在可行的情况下可适当做出设计调整以符合编程规范。
 
1.3. 对象命名
1.3.1.  数据库
第一种方式,采用Pascal样式命名,命名格式为[项目英文名称]。
示例:AdventureWorks
第二种方式,采用Pascal样式命名,命名格式为[项目英文名称] + Db。
示例:AdventureWorksDb
  BizTalkRuleEngineDb
建议采用第一种方式。
 
1.3.2.  数据库文件
数据文件:[数据库名称] + _Data.mdf
日志文件:[数据库名称] + _Log.ldf
示例:AdventureWorks_Data.mdf
      AdventureWorks_Log.ldf
 
1.3.3.  关系型数据仓库
采用Pascal样式命名,命名格式为[项目英文名称] + DW。
示例:AdventureWorksDW
 
1.3.4.  数据架构
除SQL Server 系统定义的数据架构外,新建架构采用Pascal样式命名,命名格式为[架构名]。
示例:HumanResources
      Production
 
对数据库对象 Table,View,Procedure,Function等使用数据架构进行归类。在SQL Server 2000中dbo为默认架构。
 
1.3.5.  数据表
采用Pascal样式命名,命名格式为[表名]。
示例:Employee
      Product
 
表名以英文单数命名,主要是参考SQL Server 2005示例数据库,个人理解不采用复数是为了更好的使用ORM工具生成符合编程规范的代码(比如C#)。
示例:使用Product
  而不是Products
 
1.3.6.  数据视图
视图名称采用Pascal样式命名,命名格式为v + [视图名称]。
示例:vEmployee
      vSalesPerson
 
1.3.7.  数据列
列名称命名采用英文单词或缩写,英文单词只来自于具体业务定义,尽量表达清楚含义。采用Pascal样式命名,命名格式为[列名称]。
示例:AddressID
      PostalCode
 
尽量避免使用拼音命名,如果不可避免,对于比较短的列名,采用拼音全写,如果拼音列名比较复杂,可以采用首个字用全拼,其它字用首字母大写表示。
示例:宁波 Ningbo
  经营方式 JingYFS
 
1.3.8.  存储过程
建议采用Pascal样式命名,命名格式为[存储过程名称]。
示例:GetUser
     AddUser
 
备注:在SQL Server 2005示例数据库中使用Camel样式命名。
 
1.3.9.  函数
自定义函数采用Pascal样式命名,命名格式为[函数名],系统函数使用全部大写。
示例:SELECT ISNULL(@LastName,'Unknown last name');
GETDATE()
 
1.3.10.     用户定义数据类型
采用Pascal样式命名,命名格式为[自定义数据类型名称]。
示例:Flag
      NameStyle
 
1.3.11.     DML触发器
DML触发器是当数据库服务器中发生数据操作语言 (DML) 事件时要执行的操作。DML 事件包括对表或视图发出的 UPDATE、INSERT 或 DELETE 语句。根据事件不同命名规则使用前缀进行区分,格式为 [u|i|d] + [表名|视图名]
示例:uEmployee 
  iEmployee
      dEmployee
 
另外一种方式为,
AFTER 触发器:TR_表名_[后面插入加I,修改加U,删除加D]。
INSTEAD OF 触发器:TR_表名或视图名_OF[后面插入加I,修改加U,删除加D]
 
1.3.12.     DDL触发器
响应各种数据定义语言 (DDL) 事件而激发。这些事件主要与以关键字 CREATE、ALTER 和 DROP 开头的 Transact-SQL 语句对应。执行 DDL 式操作的系统存储过程也可以激发 DDL 触发器。
采用Camel样式命名,命名单词能够描述DDL触发器功能。
示例:
CREATE TRIGGER safety 
ON DATABASE 
FOR DROP_TABLE, ALTER_TABLE 
AS 
   PRINT 'You must disable Trigger "safety" to drop or alter tables!' 
   ROLLBACK ;
 
另外一种方式为添加ddl前缀,
示例:
CREATE TRIGGER [ddlDatabaseTriggerLog] 
ON DATABASE 
FOR DDL_DATABASE_LEVEL_EVENTS 
AS
 
1.3.13.     主键、外键关系和索引
主键: PK_[表名称]_[主键];如果是组合主键,使用PK_[表名]_[主键1]_[主键2]。
示例:PK_Store_CustomerID
  PK_StoreContact_CustomerID_ContactID
外键关系:FK_[从表名称]_[主表名称]_[外键列名称]。
示例:FK_StoreContact_Store_CustomerID
 
聚集索引:PK_[表名称]_[主键];如果是组合主键,使用PK_[表名]_[主键1]_[主键2]。
示例:PK_Store_CustomerID 
  PK_StoreContact_CustomerID_ContactID
 
唯一非聚集索引:AK_[表名称]_[列名称]。
示例:AK_Store_rowguid
 
不唯一非聚集索引:PK_[表名称]_[列名称]。
示例:IX_Store_SalesPersonID
 
主 XML索引:PXML_[表名称]_[Xml类型列名称]。
示例:PXML_Store_Demographics
 
备注:以上命名参考Sql Server 2005示例数据库,一般只需设计器自动生成,不需要额外修改。
 
1.4. 参数命名
1.4.1.  数据列参数
命名格式为 @ + [列名称]。
示例:@EmployeeID
 
在列名不符合Pascal样式时(早期遗留系统),例如使用全部大写的列名称,或使用“_”进行连接的字段名称,参数名称定义使用 @ + [列名称],这里的列名称尽量符合Pascal样式命名。
 
1.4.2.  非数据列参数
在参数无法跟列名称进行关联时,使用能够反映该参数功能的英文单词或单词组合, 采用Pascal样式命名。
示例:@ErrorID
      @Flag
 
1.5. 常见命名
1.5.1.  常用字段命名
这里的常用字段是指在建表时频繁使用的表名或列名,下表对常用字段进行建议性定义,
 
列名称          数据类型             说明
CreatedDate     datetime                纪录创建日期,一般使用GETDATE()自动生成
ModifiedDate        datetime                纪录最后修改日期,首次使用GETDATE()
DeletedDate     datetime                记录删除(标记删除)日期