本文将为大家讲述如何注释自己的SQL Server,这些原理适用于所有的SQL Server版本,虽然SQL Server 2005及更高的版本包含了一些增强数据存档功能的巧妙设置。本文大部分涉及的原理也同样适用于其他的关系数据库,如Oracle、 MySQL、Microsoft Access和PostgreSQL等。
数据库命名规范
如果你是从头开始设计一个数据库,那遵循逻辑数据实体命名规范将是明智之举。下面为您提供在新数据库中给对象命名时会用到的一些建议。
一般命名规范
如果可以,数据库名称应当只使用文字和数据这两种字符。避免使用连字号,因为之后会给编写某些T-SQL查询命令造成困难。
如果可能,尽量避免在数据库实例中使用空格符,特别是为表和列命名时。虽然如果用方括号括起来的话,T-SQL还是可以辨认这些实体,不过在某些情况下也有可能导致混淆和代码错误。此外,还要尽量避免在表名和列名中使用T-SQL的保留词,例如month、year和user等。
表命名规范
当我们为表命名时,应当使用与该表存储的数据相关的名称。例如,存储企业员工数据的表可以命名为employees,注意这里使用的是名词的复数形式,因为一个表里很可能存储一个以上员工信息。
有一些程序开发人员会为表名附上像t_这样的前缀。如果这些表是引用了应用程序的源代码而来,那么这些前缀就非常有用,这样能够使软件开发团队一眼就看出来这是一个表,而不是一个视图或其他被引用的实体。
给表名附上与其功能相关的前缀(如StudentID_)可以帮助我们把表分门别类。SQL Server 2005引入了模式的概念,可以为表分类。例如StudentsEnrollments数据库中包含了StudentResources模式,而相关的表(StudentID、StudentAddress、StudentCredits等)就会在SQL Server 管理工作室表列中的这个模式下全部列出。
外键命名规范
如果能在一个数据表中识别出哪些是外键(foreign keys)会非常有用,所以在为外键命名的时候,可以添加一些类似于fk_的前缀,这样可以更直接的从表的字段中看出表的关系。
存储过程命名规范
根据用途来为存储过程命名是很有意义的。例如,GetUserID、InsertDateOfBirth、UpdateEnrollInfo等等,这样对于存储过程的用途就一目了然了。
有时候,可以适当添加后缀来表示存储过程的输入参数。例如GetUserIDByUserNameAndPassword这名称表示该存储过程会通过一个用户名和密码作为输入参数返回用户ID。这可以用来区分功能相似但参数设置不同的存储过程,还可以添加其他相关的存储过程,例如GetUserIDByGUID和GetUserIDByApplicantID。这种命名规范的缺陷就是存储过程的名字会变得很长。
一些开发人员会用特定的标签来为所有的存储程序添加前缀。其中很流行的做法是为存储程序名添加sp_前缀。不过,这里并不推荐这种做法,原因有二。首先,这对数据库性能有轻微的影响,因为SQL Server会先在主数据库中查找所有带有这个前缀的存储过程,虽然这会性能的影响很小,不过在高级和企业系统中,影响可能会放大。其次,由于微软在设计的时候也为系统的存储过程使用了这个前缀,所以始终存在着这种可能,那就是你为自己的存储过程起的名字和某个系统存储过程的名字相同。而且,SQL Server未来发布的版本中可能会引入一个新的系统存储过程,而这个过程与你现有的用户存储过程的名字相同。
如果你实在想要为自己的存储过程添加前缀,那么建议你使用usp_或sproc_这样的前缀。同样的,你可以为某个函数名加上func_这样的前缀,特别是在从应用程序源代码调用存储程序的时候非常有用,因为这让软件开发团队清楚的了解到这是在调用一个存储过程。
SQL存储过程的存档
千万不要忘记把存储过程和函数的T-SQL代码存档。由于简单的查询代码应该是自注释的,而存档将对大型的查询代码非常有用。而存储过程的标准化标头也非常有用,至少能够说明该存储过程的功能。如果手头上没有任何源控制系统,在标头中包括日志变化的内容还能够帮助我们追踪变化的发生。
数据库对象描述
能够对数据库对象进行描述在某种程度上意味着能够创建自我存档的数据库。
微软早在SQL Server 7.0就引入了一个有用的功能,就是通过表设计窗口为某个表添加描述(Description)。SQL Server 2000通过引入扩展属性(extended properties)加强了这一功能。然而,SQL Server 2000的企业管理器限制了允许属性编辑的功能。不过在 SQL Server 2005中的SQL Server管理工作室GUI允许对扩展属性进行编辑。数据库中的大部分对象(如表、列、视图、函数、存储过程和数据库本身)都具有可编辑的扩展属性。默认状态下,只有单一的扩展属性MS_Description。而且,虽然你可以利用MS_Description扩展属性来为对象添加描述,但如果没有第三方加载工具,就算添加了,用处也并不大。