数据库规范.docx
《数据库规范.docx》由会员分享,可在线阅读,更多相关《数据库规范.docx(18页珍藏版)》请在冰豆网上搜索。
数据库规范
数据库有关规范
1.使用utf8mb4字符集
2.全部表、字段一定写清中文说明
3.金额字段严禁使用小数储存(单位:
分)
4.严禁使用字段属性隐式变换(如:
“WHEREms_no=1234”ms_no
为字符串种类)
5.尽量不使用负向查问(NOT、!
=、<>、!
<、!
>、NOTIN、NOTLIKE
等)
6.严禁使用外键,若有完好性拘束,需要应用程序控制
7.严禁使用程序配置文件内的账号接见线上数据库
8.严禁非DBA对线上数据库进行写操作
9.开发、测试、线上环境分别
10.因此提交的SQL语句一定经过测试
11.严禁储存大文件或大照片
12.库名、表名、字段名:
小写,下划线切割,不超出32个字符,一定见名知意,严禁拼音英文混用
13.表一定有主键
14.一定把字段定义为NOTNULL并设置默认值
15.一定使用varchar(20)来储存手机号
16.单表索引控制在5个之内,单索引字段数不准超出5个
a)索引的使用。
?
(1)尽量防止对索引列进行计算。
如计算许多,请提请管理员
成立函数索引。
?
(2)尽量注意比较值与索引列数据种类的一致性。
?
(3)关于复合索引,SQL语句一定使用主索引列?
(4)索引中,尽量防止使用NULL。
?
(5)关于索引的比较,尽量防止使用NOT=(!
=)?
(6)查问列和排序列与索引列序次保持一致
(7)严禁在更新屡次、划分度不高(如:
性别)的字段上成立
索引
(8)成立组合索引,一定把划分度高的字段放在前方
17.严禁使用SELECT*,只获得必需的字段
18.严禁使用INSERTINTOt_xxxVALUES(xxx),一定指定插入的列
名
19.严禁在WHERE条件的属性上使用函数或表达式
20.严禁%开头的模糊查问
21.严禁使用OR条件
22.应用程序一定捕捉SQL异样,并作出相应办理
23.逻辑删除取代物理删除
24.选择最有效的表名、查问条件次序(从右到左)
25.减少接见数据库的次数
26.SQL中的重点字均使用大写字母,数据表最好起又名
27.查问条件中“>=”取代“>”
28.等号两边使用空格,逗号后使用空格
29.多表操作一定使用又名
30.整条语句一定写明说明,重点逻辑独自书写说明,说明算法、功
能
a)说明风格:
说明独自成行、放在语句前方。
?
(1)应付不易理解的分支条件表达式加说明;?
(2)对重要的计算应说明其功能;?
(3)过长的函数实现,应将其语句按实现的功能分段加以归纳性说明;?
(4)每条SQL语句均应有说明说明(表名、字段名)。
?
(5)常量及变量说明时,应说明被保留值的含义(一定),合法取值的范围(可选)?
(6)可采纳单行/多行说明。
(--或/**/方式)?
31.尽量减少使用ORDERBY与GROUPBY操作影响性能
32.全部写入上线程序的SQL语句,都一定提取保留并写清说明与所在地点模块
33.创立共享SQL语句,并写清帮助文档
34.防止变量循环赋值、使用
索引设计准则
1.应当对WHERE子句中常常使用的列创立索引
2.应当对常常用于连结表的列创立索引
3.应当对ORDERBY子句中常常使用的列创立索引
4.不该当对小型的表(仅使用几个页的表)创立索引,这是由于完好表扫描操作可能比使用索引履行的查问快
5.单表索引数不超出6个
6.不要给选择性低的字段建单列索引
7.充足利用独一拘束
8.索引包含的字段不超出5个(包含include列)
9.不要给选择性低的字段创立单列索引
10.SQLSERVER对索引字段的选择性有要求,假如选择性太低SQL
SERVER会放弃使用
11.不合适创立索引的字段:
性别、0/1、TRUE/FALSE
12.合适创立索引的字段:
ORDERID、UID等
13.充足利用独一索引
14.独一索引给SQLServer供给了保证某一列绝对没有重复值的信息,当查问剖析器经过独一索引查找到一条记录则会马上退出,不会持续查找索引
15.表索引数不超出6个
16.表索引数不超出6个(这个规则不过携程DBA经过试验以后拟订的。
。
。
)
17.索引加速了查问速度,可是却会影响写入性能
18.一个表的索引应当联合这个表有关的全部SQL综合创立,尽量合
并
19.组合索引的原则是,过滤性越好的字段越靠前
20.索引过多不单会增添编译时间,也会影响数据库选择最正确履行计
划
SQL查问
1.严禁在数据库做复杂运算
2.严禁使用SELECT*
3.严禁在索引列上使用函数或计算
4.严禁使用游标
5.严禁使用触发器
6.严禁在查问里指定索引
7.变量/参数/关系字段种类一定与字段种类一致
8.限制JOIN个数
9.限制SQL语句长度及IN子句个数
10.尽量防止大事务操作
11.封闭影响的行计数信息返回
12.使用UNIONALL代替UNION
13.查问大批数据使用分页或TOP
14.递归查问层级限制
15.NOTEXISTS代替NOTIN
16.尽量防止使用OR运算符
17.增添事务异样办理体制
严禁在数据库做复杂运算
1.XML分析
2.字符串相像性比较
3.字符串搜寻(Charindex)
4.复杂运算在程序端达成
5.严禁使用SELECT*
6.减少内存耗费和网络带宽
7.给查问优化器有时机从索引读取所需要的列
8.表构造变化时简单惹起查问犯错
严禁在索引列上使用函数或计算
假定在字段Col1上建有一个索引,则以下场景将能够使用到索引:
[Col1]=
[Col1]>100
[Col1]BETWEEN0AND99
[Col1]LIKE‘abc%’
[Col1]IN(2,3,5,7)
LIKE查问的索引问题
1.[Col1]like“abc%”?
–indexseek?
这个就用到了索引查问
2.[Col1]like“%abc%”?
–indexscan?
而这个就并未用到索引
查问
3.[Col1]like“%abc”?
–indexscan这个也并未用到索引查问
我想从上而三个例子中,大家应当理解,最好不要在
LIKE
条件前方
用模糊般配,不然就用不到索引查问。
严禁使用游标
关系数据库合适会合操作,也就是对由WHERE子句和选择列确立的结果集作会合操作,游标是供给的一个非会合操作的门路。
一般状况下,游标实现的功能常常相当于客户端的一个循环实现的功能。
游标是把结果集放在服务器内存,并经过循环一条一条办理记录,对
数据库资源(特别是内存和锁资源)的耗费是特别大的。
严禁使用触发器
触发器对应用不透明(应用层面都不知道会什么时候触发触发器,发
生也也不知道,感觉莫名)
严禁在查问里指定索引
With(index=XXX)(?
在查询里我们指定索引一般都用
With(index=XXX)?
?
)
跟着数据的变化查问语句指定的索引性能可能其实不最正确
索引对应用应是透明的,如指定的索引被删除将会致使查问报错,不
利于排障
新建的索引没法被应用马上使用,一定经过公布代码才能奏效
变量/参数/关系字段种类一定与字段种类一致
防止种类变换额外耗费的CPU,惹起的大表scan尤其严重
限制JOIN个数
单个SQL语句的表JOIN个数不可以超出5个
过多的JOIN个数会致使查问剖析器走错履行计划过多JOIN在编译履行计划时耗费很大
限制IN子句中条件个数
在IN子句中包含数目特别多的值(成百上千)可能会耗费费源并返回错误8623或8632,要求IN子句中条件个数限制在100个之内尽量防止大事务操作
只在数据需要更新时开始事务,减少资源锁拥有时间增添事务异样捕捉预办理体制
使用UNIONALL代替UNION
UNION会对SQL结果集去重排序,增添CPU、内存等耗费查问大批数据使用分页或TOP
合理限制记录返回数,防止IO、网络带宽出现瓶颈
递归查问层次限制
使用MAXRECURSION来防备不合理的递归CTE进入无穷循环
尽量防止使用OR运算符
关于OR运算符,往常会使用全表扫描,考虑分解成多个查问用
UNION/UNIONALL来实现,这里要确认查问能走到索引并返回较少的
结果集
增添事务异样办理体制
应用程序做好心外办理,及时做Rollback。
设置连结属性“setxact_aborton”
架构设计
读写分别
schema解耦
数据生命周期
读写分别
设计之初就考虑读写分别,哪怕读写同一个库,有益于迅速扩容依据读特点把读分为及时读和可延缓读分别对应到写库和读库读写分别应当考虑在读不行用状况下自动切换到写端
Schema解耦
严禁跨库JOIN
数据生命周期
依据数据的使用屡次度,对大表按期分库归档主库/归档库物理分别
日记种类的表应分区或分表
关于大的表格要进行分区,分区操作将表和索引分在多个分区,经过分区切换能够迅速实现新旧分区代替,加速数据清理速度,大幅减少IO资源耗费
屡次写入的表,需要分区或分表
说明典范?
过程说明:
过程都以sp_开头,注意过程名称要切合命名要求?
参数:
p_变量名_in(传入)、p_变量名_out(传出)
游标:
cur_变量名
/**********************************************************
****************?
name:
sp_Write_log
parameter:
p_textContext_ininvarchar2
参数描绘
?
parameter:
p_textContext_outoutvarchar2
参数描绘
?
createdate:
2003-04-1?
creater:
创立人员
desc:
过程总功能描绘
?
***********************************************************
*****************/?
函数说明:
函数以f开头,命名切合命名标准
/**********************************************************
****************?
name:
f_Get_JobId?
parameter:
p_Nameinvarchar2参数描绘
returnnumber:
返回值描绘
createdate:
2003-04-1?
creater:
创立人员?
desc:
函数总功能描绘?
***********************************************************
*****************/
视图说明?
:
视图以v开头,命名切合命名标准?
/**********************************************************
****************
name:
v_Unit_Ms?
parameter:
p_Nameinvarchar2参数描绘?
createdate:
2003-04-1?
creater:
创立人员
desc:
视图描绘
***********************************************************
*****************/
--SQL语句编写格式样例
--重点词换行,换行后空两个空格
SELECT
--用户名称
COUNT
(1)trueworkload--FROM
单位缴费个人帐户个数
t_systemuserinfots,--
t_genworkflowtg,
t_batchtb,
t_companyinfotmptc,
(
医疗保险单位缴费表
SELECTDISTINCT
batchid,
companyid,
userid,
direction,
fromwkfid,
towkfid
FROM
T_WorkflowLog
WHERE
dotimeBETWEEN'2008-09-02'
AND'2008-09-03'--)AStwfl
医疗保险缴费时间
WHERE
=
AND=
AND=
AND=
AND=1--人员类型(1:
正式职工)
AND=
GROUPBY
;