(4.9)SQL Server 数据库规范

SQL Server 数据库规范

一、       命名规范

常用对象命名规范,使用帕斯卡命名法(Pascal,单词首字母大写),统一使用英文。

1.        表。英文单数名词,尽量写完整单词名称一般不超过3个英文单词都可表达出表的意思。使用帕斯卡命名法。

如:User,UserRole,Role,Group,Family,SalesOrderDetail

错误例子:Users,UserTable

注意:特殊意义的表

自定义的元数据表,使用前缀Sys开头:SysDictionary,SysParameter,SysModel,SysRegion

业务同类表:WeChatCompany,WeChatUser,WeChatMember,SMSSend,SMSReceive

缩写表,普遍认知的缩写: US_User,EN_User,CN_User,WTO_Member,WTO_ Country

单词过多的表:User_ ZGYH(中国银行中文缩写),User_ GSYH(工商银行中文缩写)

2.        字段。与表命名雷同。

对于主键字段,统一为:ID

外键引用的字段,统一为:外键表名+ID

如 UserID,UserRoleID,SalesOrderDetailID,SysDictionaryID

3.        视图(不要使用)。

与表命名雷同。大写“V_”作为前缀,格式:V_视图名称

如:V_User,V_SysDictionary

4.        存储过程(业务处理不要使用,报表可用)。获取或执行数据的过程。

要求动名词组合。大写“USP_”作为前缀,格式:USP_存储过程名称

如:P_GetUser,P_UpdateUserByUsername,P_CleanDeletedUser,P_GetMyRecord

5.        标量函数(查询到表的不要使用)。返回单个值。

要求动名词组合,大写“FN_”作为前缀,格式:FN_函数名称

如: FN_GetUserName,FN_GetUserNameByUserID

6.        表值函数(查询到表的不要使用)。返回表。

要求动名词组合,写“TF_”作为前缀,格式:TF_函数名称

如:TF_ SplitChar,TF_ SplitCharByComma,TF_GetUserByCity

7.        触发器(不要使用)。

大写“TR_”作为前缀,触发操作为后缀,格式:TR_表/视图名称_Insert/Delete/Update

如:TR_User_Insert,TR_User_Update,TR_User_Delete

8.        索引。尽量写完涉及的字段

大写“IX_”作为前缀,格式:IX_表名称_字段名称_字段名称_……

如:IX_User_ID,IX_User_UserName_Mobile

唯一索引: UIX_表名称_字段名称

包含列索引:IX_表名称_字段名称_Include

筛选索引:IX_表名称_字段名称_Where

9.        约束。

主键约束:PK_表名称_字段名称

外键约束:FK_表名称_字段名_主表名称_主表字段(禁用外键约束!)

唯一约束:UIX_表名称_字段名称(唯一约束默认是创建唯一索引来约束)

默认值约束:DF_表名称_字段名称

Check约束:CK_表名称_字段名称

10.     临时对象。大小写不要求,其他与表名称规范相同。声明使用会话级别。

临时表:#user (不要使用 ##user)

(表)变量:@name (不要使用@@name)

二、       设计规范

对象级规范:

?  数据库表设计必须满足第三范式(特殊情况再讨论)

?  业务表都设置自增主键ID!(主键不一定是聚集索引)

?  禁止使用外键约束!(操作数据慢;维护数据困难)

? 禁止使用触发器!(程序中控制操作)

? 禁止使用视图!(维护不便,多表关联可能有字段没用。报表可用)

? 禁止使用函数访问表、视图等数据(函数只作为辅助计算工具,不参与访问数据!)

? 禁止使用存储过程处理业务逻辑(先在程序计算好再去读写数据库!)

? 禁止使用游标!(少用遍历,用集合概念来操作)

? 禁止使用临时表!(业务操作频繁会不可控)

? 禁止使用同义词!(维护易被忽略)

? (报表可用存储过程、视图、临时表,视图中的结果集不要有排序)

? (若必要使用,视图、存储过程、函数、触发器、游标等不要多层调用2 次以上!)

? 不要使用数据库关键字作为表名、字段名等(尤其系统对象名称,如:getdate、sum 等)

? 创建约束、索引等,手动设置名称,不用系统自动生成!

?  索引尽量不超过5个,尤其那些频繁更改和插入的表!

?  表和字段在数据库中须添加详细注释!(参考:sp_addextendedproperty)

?  视图、存储过程、函数、触发器等,须填写创建信息及每个操作的描述!

?  禁止在数据库中存储文件。

?  插入字符数据时,须去掉左右空格!

?  插入表时所有字段必须全部列出!(如: insert into tab(name,phone) select name, mobile from user)

?  存储过程、函数等,模块语句加上 BEGIN……END;去掉多余的空行和空格。

?  程序操作表的权限只允许select、insert、update、delete!

?  对于可能删除的业务数据,数据库不实际删除数据,增加字段 IsDeleted 来判断是否删除!

?  操作日志、系统日志等表,只允许插入,不能再修改!

?  对约束较强的枚举选项,程序应设置选项而不要用户手动随意填写!

? 业务表都添加一个时间字段:addTime datetime not null constraint DF_表名称_datetime default(getdate())

字段规范:

?  尽量设置使用 “not null”约束,数值默认0,字符默认为空’’。否则查询时 null 是不参与比较的!

?  禁用 ntext、text 和 image,用nvarchar(max)、varchar(max)和 varbinary(max)替代,尽量不用max!

?  非英文重要数据使用unicode类型保存,如nvarchar ,nchar,其他可以varchar;

?  日期时间字段统一用 datetime,精确到毫秒;

?  金额、小数类型使用 decimal,不用int、float、double(int可存储21亿,float、double精度不准)

?  状态字段统一用State(可枚举的),不用status

?  不允许明文存储密码!

三、       查询规范

u  定义的参数、变量类型要参考与字段类型和长度相同。

Declare @name varchar(50) --类型要与 User(Name)相同

Select * from User where Name = @name

u  少用游标遍历,用集合概念来处理数据。

u  操作使用 IN 内的常量不要过百,尽量少!应用其他方式改为表连接。

错误示例:select * from [User] whereName in(‘AA‘,‘BB‘,‘CC‘,‘DD‘,‘EE‘,‘FF‘,………)

u  若须用“IN”,嵌套子查询不要超过3个。

Select * from User

where Name in(

select Name

from Manager

where Sex in(Select Sex from User where Name=‘kk‘)

)

u  子查询“IN”都改为“innerjoin”方式,注意是否有一对多或多对多情况,有则先连接键分组再连接。

上面的 IN 查询可改为如下:

Select distinct t1.*

from User t1

inner join Manager t2 on t1.Name=t2.Name

inner join User t3 on t2.Sex=t3.Sex

where t3.Name=‘kk‘

u  能用“EXISTS  ”就不用“IN”,exists 可以避免可能的错误。

--表 TestRole 不存在字段 Mobile,但是查询不会报错!

select * from User where name in(select Mobile fromTestRole)

select * from User where name not in(select Mobile from TestRole)

改为:

select * from User a where exists(select 1 fromTestRole b where a.name=b.RoleName)

--表 TestRole 字段 RoleName 只要存在一个 Null ,查询则没有结果

select * from User where name not in(select RoleName from TestRole)

改为:

select * from User where name not in(select RoleName from TestRole whereRoleName is notnull)

select * from User a where not exists(select 1 from TestRole b wherea.name=b.name)

u  存储过程中首行添加:set nocount on ,主要是将执行结果显示的打印信息不返回客户端,减少网络IO。

CREATE PROC dbo.TestPro

AS

BEGIN

SET NOCOUNT ON --此处添加

…………

END

GO

u  存储过程内不要打印(print)信息,理由同上。

u  查询不用星号,哪怕字段再多也写完整,并非所有字段都用的上的。且星号不能建立合适的索引。

u  Where筛选中,不要在字段上使用函数,否则整表都扫描来进行函数处理。

Select * from User where left(Name) = ‘黄‘

改为:

Select * from User where Name like ‘黄%‘

Select * from User where convert(varchar(10),AddTime,120)=‘2018-01-01‘

改为:

Select * from User where AddTime>=‘2018-01-01‘ andAddTime<‘2018-01-02‘

u  模糊匹配like不用讲 % 放在首位。(同上)

u  时间比较注意,不必手写那么详细

Select * from User where addTime<=‘2017-12-31 23:59:59‘

改为:

Select * from User where addTime<‘2018-01-01‘

u  一致性不强或需要粗略统计的大表数据或报表,可以加上Nolock 允许脏读。

Select * from User with(nolock)

Select * from User as U with(nolock)

u  Count 是不统计null 的。计数使用 count(*),MSSQL中count(*) 默认走索引长度最小的来统计。

COUNT(*) = COUNT(1) = COUNT(‘A‘)

Select COUNT(*) from User --统计表总行数

Select COUNT(Mobile) from User --统计手机不为NULL的总行数

u  SQL Server 中,默认 null 加上任何字符都为null,所以注意!

SELECT ‘A‘+NULL --结果为 NULL

SELECT 100+NULL --结果为 NULL

—正常写法,如果字段有 NULL 值,使用 ISNULL 判断更改。

Select Name + ISNULL(Mobile,‘‘) from User

注意:集合函数 sum、avg、max、min 是忽略 NULL 的。

u  除了数据需要大量导出,任何查询一定要使用分页查询。

u  一个事务中不用频繁重复读取表数据或操作数据

u  查询尽量参数化,即先声明参数,后赋值,再把参数带入执行脚本(如: where name = @name)

Select Name,Mobile from User where Name =‘AA‘

Select Name,Mobile from User where Name =‘BB‘

改为:

Declare @name varchar(50)

Set @name = ‘AA‘

Select Name,Mobile from User where Name [email protected]

go

Declare @name varchar(50)

Set @name = ‘BB‘

Select Name,Mobile from User where Name [email protected]

go

u  多表关联情况且结果集在满足情况下,尽量使用左连接(left join)而不使用内连接( inner join)

Select t1.Name

from User t1

inner join Manager t2 on t1.ManagerID=t2.ID

where t1.Mobile=‘13000000000‘

改为:

Select t1.Name

from User t1

left join Manager t2 on t1.ManagerID=t2.ID

where t1.Mobile=‘13000000000‘

因为 Mobile 唯一,第二种情况只查询 User 表。所以当条件不确定的时候、且不影响结果,使用第二种。

u  按添加时间排序时,性能不好可以用主键聚集索引ID排序,因为ID也是递增的。

Select top(10) Name,Mobile from User order by AddTime desc

改为:

Select top(10) Name,Mobile from User order by ID desc

u  多表连接查询,使用简短别名,字段都加上别名且别名要统一!

Select t1.Name from User t1 inner join Manager t2on t1.ManagerID=t2.ID

Select a.Name from User a inner join Manager b on a.ManagerID=b.ID

Select u.Name from User u inner join Manager m on u.ManagerID=m.ID

u  编写脚本不要写在一行上面,注意缩进,每行长度尽量不超过120个字符。

u  脚本中的系统关键字保持统一,可全部大写或全部小写或首字母大写。

u  不在数据库中使用链接服务器来跨服务器查询,程序中应从一节点读取数据后再传递到另一节点操作。

u  多表连接中,“on”后面若有 “or”,则改为 union 取连接:

Select a.name,b.name From User a Inner Join Manager b On a.ManagerID=b.ID or a.Mobile=b.Mobile

改为:

Select a.name,b.name From User a Inner Join Manager b On a.ManagerID=b.ID

Union

Select a.name,b.name From User a Inner Join Manager b On a.Mobile=b.Mobile

u  不要在生产库查询大量数据,占用有效数据的IO和内存。若须查询则加 nolock。

Select * from User with(nolock)

Select * from User as U with(nolock)

u  对于复杂分页查询,可以先按照条件找出主表ID(在非聚集索引中找出ID),通过ID再关联找出分页全部数据(通过聚集索引找出所有数据)

四、       维护规范

生产库使用完整模式,测试、开发库可用简单模式

操作日志表,ID通常只做主键,没什么用。可将字段“AddTime”作为聚集索引字段和分区字段。

每次修改函数、存储过程等,备份旧的副本,记录修改信息。

数据库级别的变动,先备份数据库

大量更新、删除数据时,先备份事务日志

删除、更新数据时,把需要操作的数据存储到另一个专门的数据库中作临时备份。

删除、更新数据时,小批量操作。建议每次不超过5000行,减少了事务的粒度,也防止锁升级为表锁。

定期分批重建索引,不要一次性全部重建。

其他: Disk IO、CPU、Memery、NetWork IO、迁移、扩展等性能问题,找DBA!~

SQL Server 的最大容量规范:https://msdn.microsoft.com/zh-cn/library/ms143432(v=sql.100).aspx

原文地址:https://www.cnblogs.com/gered/p/9415406.html

时间: 2024-10-13 07:48:50

(4.9)SQL Server 数据库规范的相关文章

SQL Server 数据库规范

一. 命名规范常用对象命名规范,使用帕斯卡命名法(Pascal,单词首字母大写),统一使用英文. 1. 表.英文单数名词,尽量写完整单词名称一般不超过3个英文单词都可表达出表的意思.使用帕斯卡命名法.如:User,UserRole,Role,Group,Family,SalesOrderDetail错误例子:Users,UserTable 注意:特殊意义的表自定义的元数据表,使用前缀Sys开头:SysDictionary,SysParameter,SysModel,SysRegion业务同类表:

50种方法优化SQL Server数据库查询(转载)

原文地址:http://www.cnblogs.com/zhycyq/articles/2636748.html 查询速度慢的原因很多,常见如下几种: 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应. 3.没有创建计算列导致查询不优化. 4.内存不足 5.网络速度慢 6.查询出的数据量过大(可以采用多次查询,其他的方法降低数据量) 7.锁或者死锁(这也是查询慢最常见的问题,是程序设计的缺陷) 8.sp_lock,sp_who,活动的用

SQL Server数据库性能优化之SQL语句篇(转载)

SQL Server数据库性能优化之SQL语句篇 原文地址:http://www.blogjava.net/allen-zhe/archive/2010/07/23/326927.html 期项目需要,做了一段时间的SQL Server性能优化,遇到了一些问题,也积累了一些经验,现总结一下,与君共享.SQL Server性能优化涉及到许多方面,如良好的系统和数据库设计,优质的SQL编写,合适的数据表索引设计,甚至各种硬件因素:网络性能.服务器的性能.操作系统的性能,甚至网卡.交换机等.这篇文章主

SQL Server 数据库DML触发器 【一】

今天学习SQL Server数据库中DML触发器(DDL触发器以后有时间继续学习). 当删除一条创建有触发器的表中的内容时,触发器执行SQL语句. 1.首相先创建一张表,表名称是 [Test] , 内有三个字段,分别是 [Name], Sex, Place. 1 use inter 2 create table Test 3 ( 4 [Name] varchar(20) not null, 5 Sex varchar(20) not null, 6 Place varchar(20) not n

SQL Server数据库表重置自增主键号(通常是指ID)

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86

SQL Server数据库设计规范

SQL Server数据库设计规范 出处:http://www.cnblogs.com/kingboy2008/ 数据库设计规范 1.简介 数据库设计是指对一个给定的应用环境,构造最优的数据库模式,建立数据库及其他应用系统,使之能有效地存储数据,满足各种用户的需求.数据库设计过程中命名规范很是重要,命名规范合理的设计能够省去开发人员很多时间去区别数据库实体. 最近也因为工作需要所以整理出了这个word文档,望大家指正. 2数据库设计 数据库规划→需求分析→数据库设计→应用程序设计→实现→测试→运

SQL Server数据库性能优化之SQL语句篇

SQL Server数据库性能优化之SQL语句篇 近期项目需要,做了一段时间的SQL Server性能优化,遇到了一些问题,也积累了一些经验,现总结一下,与君共享.SQL Server性能优化涉及到许多方面,如良好的系统和数据库设计,优质的SQL编写,合适的数据表索引设计,甚至各种硬件因素:网络性能.服务器的性能.操作系统的性能,甚至网卡.交换机等.这篇文章主要讲到如何改善SQL语句,还将有另一篇讨论如何改善索引.如何改善SQL语句的一些原则: 1. 按需索取字段,跟“SELECT *”说拜拜

转载 50种方法优化SQL Server数据库查询

原文地址 http://www.cnblogs.com/zhycyq/articles/2636748.html 50种方法优化SQL Server数据库查询 查询速度慢的原因很多,常见如下几种: 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应. 3.没有创建计算列导致查询不优化. 4.内存不足 5.网络速度慢 6.查询出的数据量过大(可以采用多次查询,其他的方法降低数据量) 7.锁或者死锁(这也是查询慢最常见的问题,是程序设计的缺陷

SQL Server数据库性能优化之SQL语句篇【转】

SQL Server数据库性能优化之SQL语句篇http://www.blogjava.net/allen-zhe/archive/2010/07/23/326927.html 近期项目需要, 做了一段时间的SQL Server性能优化,遇到了一些问题,也积累了一些经验,现总结一下,与君共享.SQL Server性能优化涉及到许多方面,如良好的系统和数据库设计,优质的SQL编写,合适的数据表索引设计,甚至各种硬件因素:网络性能.服务器的性能. 操作系统的性能,甚至网卡.交换机等.这篇文章主要讲到