数据库命名规范

1.1数据库对象

对象数据库

前缀编程

数据库缓存

安全

服务器

微信

视图网络

VI并发

索引负载均衡

IX分布式

存储过程

SP

函数

FN

触发器

TR

自定义数据类型

ud

Default

DF

主键

pct.

外键

FK

rule

ru

序列

Sq

UNIQUE

uq

数据库对象采用26个英文字母(区分大小写)和0-9这十个天然数,加上下划线_组成,共63个字符。不能出现其余字符(注释除外)。

同一个数据库中这些对象名都是不能重复

C    CHECK_CONSTRAINT

D    DEFAULT_CONSTRAINT

F    FOREIGN_KEY_CONSTRAINT

IT   INTERNAL_TABLE

P    SQL_STORED_PROCEDURE

PK   PRIMARY_KEY_CONSTRAINT

S    SYSTEM_TABLE

SQ   SERVICE_QUEUE

TR   SQL_TRIGGER

U    USER_TABLE

UQ   UNIQUE_CONSTRAINT

V    VIEW

1.2命名规范规定

1.表名使用单数名

例如:对用户信息的表(User)不使用Users

2.避免无谓的表格后缀

一、 表是用来存储数据信息的,表是行的集合。那么若是表名已经可以很好地说明其包含的数据信息,就不须要再添加体现上面两点的后缀了。

二、  GuestInfo(存储客户信息)应写成Guest,FlightList(存储航班信息的表)应写成Flight

3.全部表示时间的字段,统一以 Date 来做为结尾(而不是有的使用Date,有的使用Time

以你们都熟悉的论坛来讲,须要记录会员最后一次登陆的时间,这时候通常人都会把这个字段命名为LoginTime 或者 LoginDate。这时候,已经产生了一个歧义;若是仅看表的字段名称,不去看表的内容,很容易将LoginTime理解成登陆的次数,由于,Time还有一个很经常使用的意思,就是次数

4.全部表示数目的字段,都应该以Count做为结尾

5.全部表明连接的字段,均为Url结尾

6.全部名称的字符范围为:A-Z, a-z, 0-9 _(下划线)。不容许使用其余字符做为名称。

7.采用英文单词或英文短语(包括缩写)做为名称,不能使用无心义的字符或汉语拼音。

8.名称应该清晰明了,可以准确表达事物的含义,最好可读,遵循见名知意的原则。

为避免没法达到“见名知意”的效果,表和字段的都须要添加备注(MS_Description)

9.为避免关键词冲突,全部字段使用f开头。例如 用户IdfUserId

 

1.3数据库命名规范

数据库名称不须要简写,根据实际意义来命名。例如:ReportServer

数据库名:ReportServer

逻辑数据名:ReportServer;逻辑日志名:ReportServer_log

物理数据名:ReportServer.mdf;物理日志名:ReportServer_log.LDF

CREATE DATABASE [ReportServer] ON  PRIMARY

( NAME = N'ReportServer', FILENAME = N'D:\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\useData\ReportServer.mdf' , SIZE = 3328KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )

 LOG ON

( NAME = N'ReportServer_log', FILENAME = N'D:\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\useData\ReportServer_log.LDF' , SIZE = 6400KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)

GO

注意:避免全部数据库的逻辑名称使用相同的名称。

1.4表设计命名规范

注意字段名不能使用保留关键字:如action,avg等

一、不使用tab或tbl做为表前缀(原本就是一个表,为何还要说明)

二、表名以表明表内的内容的一个和多个名词组成,如下划线分隔,每一个名词的第一个字母大写,例如:User、UserLogin,UserGroupRelation等

三、使用表的内容分类做为表名的前缀:如,与用户信息相关的表使用前缀User,与内容相关的信息使用前缀Content。

四、表的前缀之后,是表的具体内容的描述。如:用户登陆信息的表名为:UserLogin,用户在论坛中的信息的表名为:UserBBSInfo

五、一些做为多对多链接的表,可使用两个表的前缀做为表名:

         如:用户登陆表UserLogin,用户分组表GroupInfo,这两个表创建多对多关系的表名为:UserGroupRelation

1.4.1字段命名规范

1. 字段名不要存在无用前缀,例如表‘WeiXinConfig’,既然我已经知道这张表是关于微信的表,里面的名称字段可使用Name,不须要添加无用的前缀相似‘WeiXinName’,‘WeiXinGuanZhuMsg’,‘WeiXinUpImgMsg’等

2. 字段使用实际英文翻译做为命名字段,见名知意,不要使用让人看了半天都不知道是啥意思的字段(相似:lev1,lev2…)

1.5存储过程命名

存储过程名=[SP_]+[表名]+[操做名字]

[操做名字]=[insert|delete|update|calculate|confirm]

例如:SP_community_update

1.5.1只容许应用程序经过存储过程访问数据库

   只容许应用程序经过存储过程访问数据库,而不容许直接在代码中写SQL语句访问数据库。

在数据库开发项目中,大量使用存储过程有不少的好处,首先看微软提供信息:

 

 

使用 SQL Server 中的存储过程而不使用存储在客户计算机本地的 Transact-SQL 程序的优点有:

容许模块化程序设计:

只需建立过程一次并将其存储在数据库中,之后便可在程序中调用该过程任意次。存储过程可由在数据库编程方面有专长的人员建立,并可独立于程序源代码而单独修改。

容许更快执行:

若是某操做须要大量 Transact-SQL 代码或需重复执行,存储过程将比 Transact-SQL 批代码的执行要快。将在建立存储过程时对其进行分析和优化,并可在首次执行该过程后使用该过程的内存中版本。每次运行 Transact-SQL 语句时,都要从客户端重复发送,而且在 SQL Server 每次执行这些语句时,都要对其进行编译和优化。

减小网络流量:

一个须要数百行 Transact-SQL 代码的操做由一条执行过程代码的单独语句就可实现,而不须要在网络中发送数百行代码。

可做为安全机制使用:

即便对于没有直接执行存储过程当中语句的权限的用户,也可授予他们执行该存储过程的权限。

 

 

 

   除此之外,使用存储过程的好处还有:

一、  在逻辑上,存储过程将应用程序层和数据库物理结构分离开来。存储过程造成了一个应用程序和数据库之间的接口。这样的接口抽象了复杂的数据库结构,符合极限编程中“基于接口编程”的思想。

二、  将主要的业务逻辑封装在存储过程当中,可以避免在应用程序层写大量的代码(在应用程序中经过字符串插入太长的SQL语句影响效率,并且维护困难)。有助于提升开发效率,而且直接在查询分析器中调试存储过程,可以更早的发现系统中的逻辑问题,从而提升代码的质量。

三、  在网站一类的应用系统中,SQL注入式漏洞一直是难以彻底杜绝的漏洞。若是只经过存储过程来访问数据库,可以大大减小这类安全性问题。(所以,就算是简单的只有一句的SQL语句,也应该写成存储过程。)

四、  因为采用存储过程,应用程序的层面能够不关心具体的数据库结构,而只关心存储过程的接口调用。所以,在如下一些状况,存储过程的优点很是明显:

·需求变动,表的结构必需要改变。使用存储过程,只要参数不变,咱们就只须要修改相应的存储过程,而不须要修改应用程序的代码。这样的设计将减少需求变动对项目的影响。

·为提升效率,使部分字段冗余:一些常常性访问的字段,咱们能够在相关的表中进行冗余存储。这样既提升了效率,又经过存储过程屏蔽了冗余细节。

·为提升效率,使用冗余表(拆分表):一些大的表,为了提升查询效率,可能须要将记录分别保存到多个表中去。使用存储过程,有存储过程来决定从哪些拆分的表中获取或插入数据。这样提升了效率,又没必要在应用程序层面关心具体的拆分规则。

五、 使用存储过程,便于在项目后期或者运行中集中优化系统性能。在项目开发过程当中,因为各类缘由,每每没法编写高效的代码,这个问题经常在项目后期或者在运行期体现出来。经过存储过程来封装对数据库的访问,能够在项目集成之后,经过试运行观察系统的运行效率,从而很容易找出系统的瓶颈,并可以经过优化存储过程的代码来提升系统的运行效率。这样的优化,比在运用程序中优化更有效,更容易。

 

同时,过多的使用存储过程,也存在如下一些疑虑:

问题一:存储过程编译后,将做为数据库的全局对象保存,太多的存储过程将占用大量的数据库服务器的内存。

问题二:在存储过程当中实现大量的逻辑,将使大量的运算在数据库服务器上完成,而不是在应用服务器上完成。当访问量很大的时候,会大大消耗数据库服务器的CPU占用率。

在此还存在这个一个案例:有一个访问量巨大的网站,有多台WEB服务器构成一个负载均衡的服务器群集,可是只有一台中心的数据库服务器。当访问量持续增长的时候,接入更多的WEB服务器来知足高并发量的访问;可是数据库服务器却没办法一直增长。所以,就须要尽可能在WEB服务器上完成业务逻辑,尽可能避免消耗数据库服务器的资源。

 

   对于这两个担忧,个人想法是:

问题一的解决:存储过程是通过编译后的SQL语句,在内存中是二进制的代码,并不会消耗太多内存。而且,存储过程比起直接使用SQL语句来讲,效率大大提升。换个角度来讲,这是一个“以空间换时间”的方案,多消耗一点内存来换取效率的提升,是值得的。

问题二的解决:首先,在实现业务逻辑的问题上,在存储过程当中实现比在应用程序中实现更容易;其次,从开发效率上,存储过程的开发比应用程序更简单(就完成相同逻辑而言)。在高访问量的系统中,应用服务器和数据库服务器的资源分配的问题,应该从成本的角度来开率:软件开发中的成本,人工支出的费用远远高于硬件支出的成本。咱们能够很容易花钱购买更好的服务器,可是很难花钱让开发人员使程序有大幅度的提升。

使用存储过程来封装业务逻辑,首先节省的是大量的开发时间和调试时间,并可以大大提升代码的质量。所以,从成原本说,应该使用存储过程。

对于大访问量的状况,最简单的办法是投入更多的硬件成本:更快的硬盘,更大的内存和更多的CPU,还有更好的网卡…………等等。

其次,在应用程序的层面,能够大量的使用静态文件缓存的办法来减轻数据库的压力。如:不常常变化的信息,能够从数据库服务器中读取,保存为应用服务器上的XML静态文件等。

实在不行的话,应该在系统设计之初,考虑可能的访问量,将系统设计成分布式的。这样就能从根本上解决大访问量的问题。

 

1.5.2命名规范

一、存储过程的前缀和表名的前缀相似:把一系列表当作一个对象,字段为对象的属性,存储过程则为访问对象的方法。如:添加用户的存储过程取名为:User_AddUser

二、存储过程使用模块的前缀来命名。如,用户管理的存储过程使用前缀user_。

三、存储过程的前缀以后,是动词+名词形式的存储过程名(也能够是动词短语)。

1.5.3存储过程的参数命名

一、参数名采用匈牙利命名法,使用类型的前缀

二、每一个存储过程都有:@errno int和@errmsg varchar(255)两个输出参数。应用程序中能够根据这两个参数获得存储过程执行的状况。(这两个参数使用默认值,能够忽略)

errno为整型的错误信息代码,执行成功返回0。Errno的值的具体含义经过errmsg参数说明,或者经过代码中的注释或文档。

Errmsg为错误信息的字符串描述,这个参数主要用于调试期做为说明,避免在应用程序中使用该值。同时,要注意英文版系统和中文版系统中,信息的语言选择对程序的影响。

1.5.4存储过程返回的记录集

一、存储过程的输出记录集:为程序的结构清晰,存储过程最好只返回一个记录集。但在某些为了提升性能的场合,仍是能够输出多个记录集

二、记录集中,每一个输出的字段最后都指定字段的别名,以面真实的字段名信息流失到客户端,从而加大黑客找到系统漏洞的可能。

 

1.5.5格式约定

一、  全部SQL关键字大写

二、  使用良好的变量命名规范

三、  保持良好的结构,包括空行、缩进和空格等。

四、  块状的语句,必定要写上BEGIN…END

五、  在每一个存储过程的开头加上详细的注释:包括存储过程名称、参数说明、功能说明、返回数据集说明、以及做者和版权声明。

六、  每一个存储过程内的代码先后必须加上SET NOCOUNT ON 和SET NOCOUNT OFF。

七、  存储过程格式的示例以下:

CREATE PROCEDURE SP_User_update

(

         @Options VarChar(100),

         @strUserName varchar(20),

         @strPwd varchar(50),

         @errno int = 0 OUTPUT,

         @errmsg varchar(255)=NULL OUTPUT

)

 

AS

BEGIN

  IF @Options='UP1'

         BEGIN

         SET NOCOUNT ON

         /*如下是存储过程的代码*/

         SET NOCOUNT OFF

         END

         

 IF @Options='UP2'

         BEGIN

         SET NOCOUNT ON

         /*如下是存储过程的代码*/

         SET NOCOUNT OFF

         END

END

 

 

1.6视图命名

一个数据库中的视图名不能重复

视图名=VI(前缀)+[表名]..[表名]+[描述]

1.7主键命名

一个数据库中的主键名不能重复

主键名=PK_(前缀)+[表名]

例如:PK_Community

 

1.8外键命名

一个数据库中的外键名不能重复

外键名=FK_(前缀)+[主表名]+[从表名]+[字段名]

考虑这样一个关系,表Hotel,字段fId, fName, fCityId。表fCity,字段fId,fName。由于一个城市可能有好多家酒店,因此是一个一对多的关系,fCity是主表(1方),fHotel是从表(多方)。在fHotel表中,fCityId是作为外键使用。

在实现外键的时候咱们能够这样写:

ALTER TABLE HotelInfo
ADD CONSTRAINT FK_Hotel_City_Cityid  FOREIGN KEY (CityID) REFERENCES City(ID)

1.9触发器命名

1. 前缀(tr),描述了数据库对象的类型。

2. 基本部分,描述触发器所加的表。

3. 后缀(_I、_U、_D),显示了修改语句(Insert, Update及Delete)

触发器名=TR_(前缀)+[表名]+[ _I、_U、_D]+[字段\描述]

例如:TR _Communtiy_u_name(对表community的字段name进行更新)

 

1.10 default约束

  使用格式如:DF_[表名]_[列名]

例如:DF _Community_Age
 

1.11 check约束

格式:CK_[表名]_[列名]

例如:CK_Community_Number

1.12 unique约束

格式:UQ_[表名]_[列名]

例如:UQ_Community_Name

 

1.13字段命名规范

一、字段不使用任何前缀(表名表明了一个名称空间,字段前面再加前缀显得罗嗦)

二、字典名也避免采用过于广泛过于简单的名称:例如,用户表中,用户名的字段为UserName比Name更好。

三、布尔型的字段,以一些助动词开头,更加直接生动:如,用户是否有留言HasMessage,用户是否经过检查IsChecked等。

四、字段名为英文短语、形容词+名词或助动词+动词时态的形式表示,大小写混合,遵循“见名知意”的原则。

1.14 SQL语句规范

一、不容许写SELECT * FROM ……,必须指明须要读取的具体字段。

二、不容许在应用程序代码中直接写SQL语句访问数据库。

三、避免在一行内写太长的SQL语句,在SQL关键字的地方将SQL语句分红多行会更加清晰。

  如:SELECT fUserID,fUserName,fUserPwd FROM User_Login WHERE fAreaID=20

修改为:

SELECT fUserID,fUserName,fUserPwd

FROM User_Login

WHERE fAreaID=20

更加直观

四、在一些块形式的SQL语句中,就算只有一行代码,也要加上BEGIN…END块。

   如:IF EXISTS(…)

                            SET @nVar = 100

应该写成:

IF EXISTS(…)

BEGIN

           SET @nVar = 100

END

五、SQL批处理语句的空行和缩进与通常的结构化程序语言一致,应该保持良好的代码格式。

六、全部的SQL关键字大写

 

1.15游标使用约定

一、  若无必要,不要使用游标

二、  包含游标的存储过程,必须对性能进行认真测试。

 

1.16索引命名规范

对于数据库的维护建索引是很日常的事情,可是若是没有一个规范化的命名,咱们对于一个表的诸多索引可能须要花上一段时间的了解。

1. 若是表中存在主键默认状况下,表的汇集性索引也就是主键列,主键的命名前面已经有提到过,索引名也跟主键名同样,(PK_表名)

2. 对于表上的非汇集索引,建议使用(IX_表名_字段简写),对于不少命名文章上提到的须要详细表达出具体的列,我我的以为没有必要,首先非汇集索引常常涉及多列,很难罗列出全部列;还有影响美观

当你执行SELECT  fNAME  FROM SYS.COLUMNS 查询索引时,你根据NAME名很快就知道索引来自那张表,是不是非汇集索引,而不用根据OBJECTID列去跟对象表关联。

1.17函数命名规范

函数命名分两类:1.针对对象的函数,2.用做辅助功能操做的函数(不针对具体的数据库对象)

1. 第一类命名:FN_+[User]+_+[对象名] 例如:FN_User_Student(对于Student进行操做函数)

2. 第二类命名:FN_[具体函数解释] 例如:FN_Spit(对字段进行拆分函数)

相关文章
相关标签/搜索