MSSQL数据库设计规则(1)

来源:互联网 发布:ubuntu 安装包管理器 编辑:程序博客网 时间:2024/05/29 21:29
 

1 设计规范:
1.1 采用有意义的字段名
尽可能地把字段描述的清楚些。当然,也别做过头了,比如CustomerShippingAddressStreetLine1 虽然很富有说明性,但没人愿意键入这么长的名字,具体尺度就在你的把握中。
每个单词的首个字母要求用大写,不要用下划线来连接每个单词!!!

1.2 遵守3NF 标准3NF 规定:
A.
表内的每一个值都只能被表达一次。

B.表内的每一行都应该被唯一的标识(有唯一键)

C.表内不应该存储依赖于其他键的非键信息。

1.3 小心保留词
要保证你的字段名没有和保留词、数据库系统或者常用访问方法冲突,比如,写的一个ODBC 连接程序里有个表,其中就用了DESC 作为说明字段名。后果可想而知!DESC DESCENDING 缩写后的保留词。表里的一个SELECT *语句倒是能用,但我得到的却是一大堆毫无用处的信息。

1.4 保持字段名和类型的一致性
在命名字段并为其指定数据类型的时候一定要保证一致性。假如字段在某个表中叫做“AgreeMentNumber”,你就别在另一个表里把名字改成“ref1”。假如数据类型在一个表里是整数,那在另一个表里可就别变成字符型了。记住,你干完自己的活了,其他人还要用你的数据库呢。

2 命名规则:
2.1 数据库(Database)的定义
数据库名称 = 数据库内容标识(首字大写)

 

2.2 (Table)的定义
命名应尽量反映存储的数据内容。

表名前缀:以该表及与该表相关联的一系列表的内容而得到一个代表统一的标识

表名称 = 表名前缀 + 表内容标识(首字大写)

ClientInfo相关联的一系的表以ci作为前缀,

即有表名:ciHistory,ciContact,ciBusiness

2.25 字段(Field)的定义
字段是数据库中的用途最广泛的,它的类型非常多,所以必须加类型前缀来标示它的类型

字段名称 = 字段类型前缀 + 字段内容标识(首字大写)

2.2视图名
 
视图的名称 = "vw" + 视图内容标识(首字大写)

vUserPerm

2.3触发器名
触发类型触发标识

-----------------------------------

Inserti

Deleted

Updateu

 触发名= "tr" + 触发标识 + 相应的表名

如:triClienttrdClient

2.4存储过程名
存储过程功能存储过程功能前缀

----------------------------------------

添加a

更新u

删除d

查询或其它o

 

存储过程名称 = 存储过程功能前缀 + 存储过程内容标识(首字大写)

spoChkUserPerm

2.5变量名
每个单词的首个字母为大写,如@EmployeeName

2.6命名中其他注意事项
禁止使用中文命名!!!!!

命名都不得超过30个字符的系统限制,变量名的长度限制为29(不包括标识字符@)

命名都采用英文字符,每个单词的首个字母要大写

2.7 SQL语句的编写规范
数据库中存储过程和触发器中涉及大量的SQL语句,对SQL语句的编写规范如下:

关键字大写:在SQL语句的编写中,凡是SQL语句的关键字一律大写,如:SELECTORDER BY GROUP BY FROMWHERE UPDATE INSERT INTO SET BEGIN END ......

2.8 Rule
   ru+Rule
标识

2.9 主键
   pk+
表名+主键标识

2.10 外键
   fk+
表名+主表名+外键标识

2.11 索引
   idx+
字段标识

2.12 Default
   df+Default
标识

3 编程结构和描述
SQL SERVER
系统中,一个批处理是从客户传给服务器的一个完整的包,可以包含若干条SQL语句。批处理中的语句是作为一组去进行语法分析、编译和执行的。触发器、存储过程等数据对象则是将批处理永久化的方法。

3.1注释
注释可以包含在批处理中。在触发器、存储过程中包含描述性注释将大大增加文本的可读性和可维护性。本规范建议:

1、注释以英文为主。
   
实际应用中,发现以中文注释的SQL语句版本在英文环境中不可用。为避免后续版本执行过程中发生某些异常错误,建议使用英文注释。

2、注释尽可能详细、全面。
创建每一数据对象前,应具体描述该对象的功能和用途。

传入参数的含义应该有所说明。如果取值范围确定,也应该一并说明。取值有特定含义的变量(如boolean类型变量),应给出每个值的含义。

3、注释语法包含两种情况:单行注释、多行注释
单行注释:注释前有两个连字符(--),最后以行尾序列(CR-LF)结束。一般,对变量、条件子句可以采用该类注释。

多行注释:符号/**/之间的内容为注释内容。对某项完整的操作建议使用该类注释。

4、注释简洁,同时应描述清晰。
3.2
函数注释:
编写函数文本--如触发器、存储过程以及其他数据对象--时,必须为每个函数增加适当注释。该注释以多行注释为主,主要结构如下:

/*******************************************************************************************

*   存储过程:读取用户所分配的操作模块及具体权限

*   saiko

*  

*   编制日期:2004.11.27

*   输入参数:共有2个参数

*         @cUserNo:用户编号

*         @cUserPassword:验证密码

*   输出参数:@eResult    1. 成功= 销售@0001   2. 失败 =Null    3. @eResult  无关  输出是记录集

*   调用例子:declare @eResult varchar(50)exec  uChkUserPerm  '0755' ,'123456', '销售'

*       明: 

*              

******************************************************************************************/

CREATE PROCEDURE spoxxx

3.3条件执行语句if…else
条件语句块(statenemt block,以 begin…end为边界)仅在if子句的条件为真时才被执行。为提高代码的可读性,建议嵌套不多于5层。还有,当嵌套层次太多时,应该考虑是否可以使用case语句。

3.4重复执行while和跳转语句goto
需要多次执行的语句,可以使用while结构。其中,控制while循环的条件在任何处理开始之前需要先执行一次。循环体中的保留字break无条件的退出while循环,然后继续处理后续语句;保留字continue重新计算while条件,如果条件为真,则从循环开始处重新执行各语句。

使用跳转语句goto和标签label也可以方便地实现循环和其他更灵活的操作。SQL SERVER仅具有单通道语法分析器,因此不能解析对尚未创建的对象所做的前向参考。换言之,跳转到某标签的后续语句应该是可执行的(如不存在可能尚未创建的数据对象)。

3.5书写格式
数据库服务器端的触发器和存储过程是一类特殊的文本,为方便开发和维护,提高代码的易读性和可维护性。规范建议按照分级缩进格式编写该文本。

顺序执行的各命令位于同一级;条件语句块(statenemt block,以 begin…end为边界)位于下一级,类推。

SQL语句是该文本的主体。为适应某些教复杂的用户需求,SQL语句可能比较庞大。为方便阅读和维护,规范建议按照SQL语句中系统保留字的关键程度再划分为三级。具体分级请参照下表。其中,非系统保留字(如字段名、数据表名、标点符号)相对本级保留字再缩进一级。多个连续的非保留字可以分行书写,也可以写在同一行。当WHERE包含的条件子句教复杂时,应该每行只写一个条件分句,并为重要的条件字句填写单行注释。

在保证基本缩进格式的前提下,可以通过对齐某些重要关键字(如条件关键字ANDOR,符号 = <> 等)来进一步提高文本的易读性和可维护性。

相邻两级的缩进量为10个空格。这也是ISQL编辑器默认的文本缩进量。另外,在ISQL编辑器中,一个TAB键也相当于10个空格。

 

注:按照功能,四类SQL语句(SELECTINSERTUPDATEDELETE)的关键字可以划分为三类:主关键字、次关键字、一般关键字。如下表所示:

主关键字次关键字一般关键字

SELECTINSERT INTOUPDATEDELETE FROMWHEREVALUESINSERT…SELECT…FROM语句中的SELECTFROMANDORBETWEENINLIKE

3.6字体
系统保留字应大写,包括系统公共变量等。其他字符(如用户自定义变量、用户自定义数据对象名)小写。

需要特殊强调的部分可以大写

一条完整注释语句的首字符应大写。对某变量、某条件字句的注释可以全部使用小写。

 

通过下一节中生成表r_a的删除触发器的实例可以部分说明对象命名、注释、基本书写格式和字符大小写方面的一些注意事项。

4触发器编程规范
4.1
范例
下面通过一个例子,说明触发器编程中应遵守的规范:

 /* delete related r_a according to deleted table */

CREATE TRIGGER r_a_d ON r_a

      FOR DELETE

AS

IF @@ROWCOUNT = 0 -no rows deleted

          RETURN

 /* delete r_b table related to deleted table */

DELETE r_b

          FROM r_b b, deleted d

          WHERE b.id=d.id

 

IF @@ERROR != 0

    BEGIN

          RAISERROR("Error occurred deleting related records", 16, 1)

          ROLLBACK TRAN

END

RETURN

数据库设计规范
A
   表命名规则
&#61548;      
数据库中不论是表名还是字段名,都一律用英文,不准出现其它语言;且保留原来的字段名,保留它们的规范;

&#61548;       为了不增加数据库当中的表名的长度,一般不允许出现如Form或者Table的字样,如:记录表:应为Record,而不是RecordTable

&#61548;       数据库当中的表名的命名,一般不准出现空格,假如有几个单词出现的话,每个单词之间不允许留有空格,用 ”_” 隔开如人事信息表:应为Human_Info,而不是Human Info;每个单词的第一个字母必须大写;如果太长,为了不增加编程的难度可采用缩写的方式,每个单词可取三到四个字母表示,也可根据实际情况,实际习惯进行缩写

B   列命名规则
表中的字段名的命名方式与表名的命名方式一致,只是不需要模块的前缀,但是为了编程的方便性,可在前面加上字段类型的前缀,一般取用类型的三个字母,但是不需要下化线,而且这三个字母必须小写;如姓名字段为字符型的话就应该为chrName;尝用字段类型的缩写可参考下面的表格:

缩写       类型

chr         char

nvr  nvarchar

num numeric

flt    float

dtm  datetime

int    Int(integer)

mny money

img  image

txt   text

rel    real

ntx   ntext

 

C 数据库对象命名规则

命名规则为 :对象类型  +  变量的含义

数据库对象命名可归纳如下:

对象       前缀       示例

        Sales_Reps

    数据类型       intAuthorId

[View] vw   vwContractAuthors

存储过程 [Store Procedure] prc  prDeleteTerminatedReps

[Rules]       rl     rlZipCheck

[Default]     df    dfStandardQuanity

用户自定义数据类型    dt    dtAddressLine

用户自定义功能    fn    fnParser

索引(聚集)     ic     icAuthorFullName

索引(非聚集) in     inClientStateCity

主键(聚集)     pc    pcCustomerId

主键(非聚集) pk    pnSstateLookupId

[Foreign Key]     fk    fkRepCompanyId

触发器 [Trigger]   tr     trStoreDelete

游标 [Cursor]       cr    crTables

 

D   特殊规则
&#61548;      
在字段的类型上面,为了不因为系统的设置而造成编程上面的问题,所以只要是日期类型,一般都用字符型来代替,其长度不应该小于10位,而且存储格式统一,如2002-07-15

&#61548;       为了避免在以后的编程以及字体差异方面带来不利,因此只要是能下拉的字段一般都指定统一的编码,可以取用数字型来代替,但必须著名每个数字代表的意思;如性别字段:可以采用数字代替的方式,1:代表男,0:代表女;而且要在字段后面的备注栏中填写清楚。