SQLServer数据库设计规范

一、数据库对象命名规范:
    1、对象前缀命名,注意,前缀命名一般用小写:
      表的前缀:业务模块组名前缀(ex.系统维护前缀sm)
      数据列的前缀:一般采用此列的数据类型做前缀(以下列举了常用的数据类型的前缀命名)
          数据类型                      前缀
          char                            c
          varchar                        vc
          int                            i
          smallint                        si(与int不要命名成一样,因为它只能表示到0-32767之间数据,会造成误解)
          datetime                        dt
          money                          m
          numeric                        n
          decimal                        d
          float                          f
          bit                            b
          binary                          bn
          image                          img
          text                            tx                     
      存储过程前缀:udp(User define procedure)表示用户定义存储过程,用它以区分出系统存储过程(sp),
                    如果我们写的是系统类存储过程请写usp前缀。
      自定义函数前缀:udf(User define function)表示用户定义函数。
      自定义视图前缀:udv(User Define View)表示用户自定义视图
      自定义规则前缀:udr(User Define rule)表示用户自定义规则
      自定义约束前缀:uck(User Checker)表示用户自定义约束
      索引前缀      :idx(Index)表示定义的是索引
      主键前缀      :pk(primary keys)表示主键

  2、对象命名规范
      前面是对象前缀的命名,下面的规范是具体的对象实体的命名。当对象命名好了后,在对象名前加入前缀便形成了
      整个的对象名称。
      对象命名:
          简单的说,如果表名是一个单词,别名就取单词的前4个字母;如果表名是两个单词,就各取两个单词的前两个字母
      组成4个字母长的别名;如果表的名字由3个单词组成,你不妨从头两个单词中各取一个然后从最后一个单词中再取出两
      个字母,结果还是组成4字母长的别名,其余依次类推。     

  以上命名规范在长运项目开发中得到具体的实现!

二、设计规范
    1、对象注释规则:
      每个对象在创建时应该都有注释头及注释内容
      注释头:注释头应该表明此对象具体实现功能,与之相关的对象以及操作参数、作者及最后修改时间。
              以下是一个存储过程的注释说明例子:
              /*
                存储过程:CalLnIncome
                功    能:传来一个时间段,计算这个时间段内运量单的营收情况
                相关数据:LnLineInfo,lnStation:提供线路及线路分成信息
                          pbTransportBill,pbTrnasInfo:提供运量单数据
                          lnInComeList:计算结果保存在此表中
                执行成功标记:lnCostList表内有最新时段的加总分成数据

                                                                  最后修改:By yczyk,2003.11.20
              */               

      注释内容:
          系统操作类的语句一般无须注释,如启动事务,关闭字符显示等语句。其他业务性的操作都应该写清楚注释。
          系统操作类一般都写在语句开始和最后,它与具体业务语句用分隔符分开!
            以下是一个例子:

SET QUOTED_IDENTIFIER ON 
 
                SET ANSI_NULLS ON 
 
                SET ANSI_WARNINGS ON 
 
                SET XACT_ABORT ON 
 
                /*==============================================================*/ 
 
                declare @ServerName varchar(50),@UserName varchar(20),@Password varchar(20),@DBName varchar(30), 
 
                        @TableQuery varchar(4000)--参数定义 
 
                select @ServerName=vcComputer,@UserName=vcUserName,@Password=vcPassword,@DBName=vcDataBase 
 
                      from smDataParam 
 
              --同步更新部门 
 
                set @TableQuery='select * into ##QJGroupInfo from opendatasource('+'''SQLOLEDB'','+'''Data 
 
                    Source='+rtrim(@ServerName)+';User ID='+rtrim(@UserName)+';Password=' 
 
                  +rtrim(@Password)+''').'+rtrim(@DBName)+'.dbo.QJGroupInfo' 
 
                --将数据导到当前连接服务器的全局临时表中备用,以后只要操作##QJGroupInfo表就可以 
 
                exec (@TableQuery) 
 
                --根据对应表更新 
 
                update smDept set vcDeptName=t.GroupName from ( 
 
                    select  m.vcTransDeptNo,g.GroupName from ##QJGroupInfo g inner join smDeptRelate m 
 
                    on m.vcSourceDeptNo=g.GroupID where m.RelateKind=0)as t where cDeptNo=t.vcTransDeptNo



    2、数据库设计规范

            数据库设计分为逻辑设计和物理设计(参考SQLServer联机丛书),一般建议先对数据库进行逻辑建模,再将逻辑
        上的设计映射于物理设计。在逻辑设计时,请注意对象之间的关联性和数据的冗余性。

        表设计原则:
          如果你发现自己在重复输入数据,请创建新表和新的关系。
            每个表中都可以考虑添加的3个有用的字段
            · RecoredID  ,记录唯一编号,不建议采用业务数据作为记录的唯一编号
            · CreationDate,而在SQL Server 下默认为GETDATE()
            · RecordCreator,在SQL Server 下默认为NOT NULL DEFAULT USER
            · RecordVersion,记录的版本标记;有助于准确说明记录中出现null 数据或者丢失数据的原因

        数据类型:
          字符类型
              一般不建议采用char而采用varchar数据类型,除非当这列数据的长度特别固定时可以考虑用char。char在不足
              长度时会自动填补空格,而我们在写语句时往往会忽略除去空格这步操作而造成隐藏的错误。
          数值类型
              如果表示金额货币建议用money型数据,如果表示科学记数建议用numeric数据类型。
          记录标识
              一般采用int类型标识唯一一行记录。此列是否采用自动累增视具体情况而定。如果需要在保存之前得到此标记
              的值,就不能用自动累增了。因为自动累增的值是自动维护的,它的记录编号并不正确的代表数据新增的先后
              次序,如果你要严格控制记录的加入次序,也不能用自动累增类型。
        索引:
        。所有的表都应该有一个主键索引,这对提高数据库的性能很有帮助。
          。对于经常用于作为查询条件的列也应该建立索引。至于建立索引的类型(聚集索引或非聚集索引、唯一索引)视情
            况定。如果表中能够用几个字段确定一笔记录,可以考虑建立唯一索引,但建立了唯一索引后就有了一个约束,如
            果新增或是修改后的数据与表中其他记录的唯一索引键值相同就会操作失败。
          。如果一个表记录数过多,而自己如何建立索引不太熟悉,可以考虑在查询分析器里索引优化向导得到SQLServer
            提供的索引建议。
          。你可以在分析器里执行指定语句的查询执行计划,根据执行计划显示的查询成本来调整相应的查询语句。
                 
      保证数据的一致性和完整性:
          数据的完整性和一致性可以用以下的策略来维护:
          。主外键关联
                建立主外键关联可以降低数据冗余,提高查询效率。虽然平时我们可以用join语句在不同的表之间进行关联,
            但这样的关系没有有效性检测,无法阻止非法数据的输入。主外键关联可以帮我们进行这种有效性的检测,我们可
            以在设计完表后通过企业管理器的关系图统一建立好关联图。所有的关联都建立好了后,我们可以在视图的建立里
            发现,当添加的表如果有主外键关联的话,视图自动为我们建议好了关联查询了。

            关于数据冗余:
                建立关联可以减少数据冗余,但如果需要保存历史数据时,这种数据冗余却是必要的。比如:你的销售表中
            记录了商品的的售价,而你的售价记录在商品库中。你的商品售价是随着时间的变化而变化的,这个时间你的销售
            表中就应该记录当时的商品售价了。

          。建立约束实现数据有效性检测
                你可以为某一列特别重要的值建立好约束。例如,你需要凭数据库里面的SaleKind列数据判定销售类别,你有
            0值为门店销售,1为网上销售。你系统只有这两种销售渠道,你就应该为它建立约束,它的值只能在0和1之间。即
            SaleKind>0 and SaleKind<3
       
          。设置默认值
                适当的设置默认值。
         
          。视图
                有些时间数据的安全性还可以用视图来控制。视图可以把用户关心的那部分数据显示给用户,而把无关的数据
            隐藏起来。

        安全性:
            操作数据库不建议用SA用户,因为SA用户权限过大。具体的应用应该创建相应的数据库操作用户,并只赋给它指定
        数据库操作的权限! 

      所有的这些规则保护了我们的数据,使我们获取了正确性和完整性良好的数据。在建立这些规则后,如果违反规则的话,
  将会触发数据库异常。程序是操作数据库的主要渠道,这些规则将迫使程序员不得不仔细的去考虑对数据库的操作。建立良
  好的规则将杜绝很多的隐患,同时也是对用户负责的一种表现。建立程序员在操作数据库时建立异常保护机制,如果是发现
  了异常建议写入数据库的日志表,查询日志表以发现自己程序中操作数据库中的失误。