数据库设计和编码规范分享 .pdf
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《数据库设计和编码规范分享 .pdf》由会员分享,可在线阅读,更多相关《数据库设计和编码规范分享 .pdf(37页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、数据库设计和编码规范Version 1.0名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 37 页 -目录1简介.1.1读者对象 .1.2目的.2数据库命名规范 .2.1规范总体要求.2.2数据库对象命名规范.2.3变量命名规范.3数据库设计规范 .3.1选择有效的设计工具.3.2表的设计 .3.2.1遵守范式要求.3.2.2字段设计 .3.2.3适当的合理的冗余.3.2.4注意大类型的字段设计.3.3表关系和约束设计.3.3.1主键设计 .3.3.2 外键设计 .3.3.3 检查约束 .3.4索引的设计 .3.4.1聚集索引和非聚集索引.3.4.2索引的初始创建原则.3.4.3
2、索引的注意事项.3.4.4索引的后期维护工作.3.5物理存储设计.3.5.1日志文件另外存放.3.5.2存储空间的设计.4T-SQL 编码规范 .4.1书写基本规范.4.2使用可搜索参数(WHERE使用原则).4.3少用触发器和禁用游标.4.4联合查询尽可能使用UNION ALL.4.5尽可能避免的地方.4.6避免返回和使用多余的数据.4.7操作符优化 .4.8数据库事务处理原则.4.9最少次数的访问表.4.10避免隐含的数据类型转换.名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 37 页 -4.11表变量、临时表和公用表达式的用法.4.12正确地判断记录是否存在.4.13注意
3、自定义标量函数的影响.4.14避免编写复杂的TSQL 语句 .4.15应用程序层防止执行大块的TSQL 语句 .4.16对数据库大表的处理方案.4.17SP_EXECUTESQL代替 EXEC.4.18存储过程的一些建议.5如何进行质量控制 .5.1规范的制定、认可和实施.5.2讨论和检查工作.5.3对制定的规范不断完善.5.4讨论和制定公共模板.5.4.1SELECT 语句.5.4.2JOIN 语句.5.4.3子查询 .5.4.4INSERT 语句 .5.4.5UPDATE 语句.5.4.6DELETE 语句 .5.4.7CASE 语句.5.4.8IF 语句.5.4.9WHILE 语句 .E
4、XISTS 语句.变量声明 .变量赋值 .创建表及约束索引.存储过程 .带输出参数的存储过程.视图 .物化视图 .自定义标量函数.自定义表值函数(多语句).自定义表值函数(内联).索引整理 .数据库事务格式.名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共 37 页 -1简介1.1 读者对象此文档说明书供开发部全体成员阅读。1.2 目的一个合理的数据库结构设计是保证系统性能的基础。一个好的规范让新手容易进入状态且少犯错,保持团队支持顺畅,系统长久使用后不至于紊乱,让管理者易于在众多对象中,获取所需或理清问题。同时,定义标准程序也需要团队合作,讨论出大家愿意遵循的规范。随着时间演进,
5、还需要逐步校订与修改规范,让团队运行更为顺畅。2数据库命名规范团队开发与管理信息系统讲究默契,而制定服务器、数据库对象、变量等命名规则是建立默契的基本。命名规则是让所有的数据库用户,如数据库管理员、程序设计人员和程序开发人员,可以直观地辨识对象用途。而命名规则大都约定俗成,可以依照公司文化、团队习惯修改并落实。2.1 规范总体要求1.避免使用系统产品本身的惯例,让用户混淆自定义对象和系统对象或关键词。例如,存储过程不要以 sp_或 xp_开头,因为SQL SERVER 的系统存储过程以sp_开头,扩展存储过程以xp_开头。2.不要使用空白符号、运算符号、中文字、关键词来命名对象。名师资料总结-
6、精品资料欢迎下载-名师精心整理-第 4 页,共 37 页 -3.名称不宜过于简略,要让对象的用途直观易懂,但也不宜过长,造成使用不方便。4.不用为数据表内字段名称加上数据类型的缩写。5.名称中最好不要包括中划线。6.禁止使用 拼音+英语 的方式来命名数据库对象或变量。2.2 数据库对象命名规范我们约定,数据库对象包括表、视图(查询)、存储过程(参数查询)、函数、约束。对象名字由前缀和实际名字组成,长度不超过30。避免中文和保留关键字,做到简洁又有意义。前缀就是要求每种对象有固定的开头字符串,而开头字符串宜短且字数统一。可以讨论一下对各种对象的命名规范,通过后严格按照要求实施。例如:对象命名规范
7、数据库数据库名:项目英文名称+DB 数据文件:数据库名称+_Data.mdf 日志文件:数据库名称+_Log.ldf 表前缀 T+表名;单词首写字母为大写,其余全部小写。示范:TCustomer 表字段不需要前缀,直接用英文单词或缩写,单词首字母为大写,其余为小写。例如:UserName,如果是两个单词的首写字母缩写,统一用大写,比如:UserID 主键所在字段不要用 ID。一律用表名+ID(如果表名太长的话,采用缩写用各单词的首写字母组合)存储过程用 P_前缀+功能描述 (首单词大写,其余下写)例如:P_GetAllCorps 视图用前缀 V_+视图名称 例如:V_Account 自定义标量
8、函数前缀 F_+功能描述 (首单词大写,其余下写)例如:F_GetEWSourceName 自定义表值函数前缀 TF_+功能描述 (首单词大写,其余下写)主键PK_ 表名 例如:PK_TExAccount 外键用 FK_ 主表名 _字段表表示(考虑到名字会比较长,突出主表)例如:FK_TOrder_OrderID 默认值约束用 DF_表名 _ 字段名 表示例如:DF_TOrder_Type 名师资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 37 页 -检查约束用 CK_ 表名 _字段名 表示例如:CK_TCustomer_Mail 唯一性约束用 UQ_表名 _字段名 表示例如:UQ
9、_TCustomer_Code 聚集索引用 DX_ 表名 _字段名 表示例如:DX_TCachet_ID 其它索引用 IX_ 表名 _ 字段名 表示(字段名较多时,取前面两个即可)例如:IX_TCachet_CName_CorpID 2.3 变量命名规范1.数据列参数命名格式为+列名称。示例:EmployeeID employee_id 2.非数据列参数在参数无法跟列名称进行关联时,使用能够反映该参数功能的英文单词或单词组合,采用 Pascal 样式命名。示例:WorkType work_type 3数据库设计规范好的数据库架构设计对系统运行的性能起着很大的作用,所以要在开始时就要引起重视。为
10、了保证数据库设计的高效必须安排时间对设计结果进行评审,这一环节必不可少。3.1 选择有效的设计工具数据库设计工具:Power Designer、ER Studio、Rose、Microsoft Visio。项目开始前要确定使用哪种设计工具。(另有开发插件:RedGate系列(SQL Prompt)选择的工具要便于讨论便入生成脚本导入数据库。设计通过后要形成文档,并且这个结构设计文档要存档,签入VSS 基线库中。名师资料总结-精品资料欢迎下载-名师精心整理-第 6 页,共 37 页 -在进行数据库设计时,应随时进行数据字典的维护。(字段要求写说明)3.2 表的设计表设计在数据库设计中占据有十分重
11、要的地位。表是实际存储数据的对象。除了要注重表结构设计,字段的设计之外还要注意表之间关系的设计。3.2.1 遵守范式要求通常,合理的规范化会最小化数据异常和减少数据的冗余。为了更新数据的正确与快速,在设计的初始阶段多采用三范式 设计数据库表。第一范式强调的是列的原子性,即列不能够再分成其他几列。第二范式包含两层意思,一是表必须有一个主键;二是非主键列必须完全依赖于主键,且不能只依赖于主键的一部分。(尽量少使用复合主键)第三范式需要确保数据表中的所有非主键列直接与主键列相关,而不能直接依赖于非主键列。3.2.2 字段设计1.尽量避免可为空的列。虽然在个别情况下,允许空值可能是有用的,但是应尽量少
12、用。这是因为需要对它们进行特殊处理,从而会增加数据操作的复杂性和增加CPU额外的逻辑判断。很多情况下可以考虑用默认值0或空字符串()来代替 NULL 值。所以字段应该有NOT NULL 的限制。2.Unicode的选择。nvarchar和 nchar 相应比varchar和 char 要占用更多的存储空间。设计的原则是:如果确保存储的内容只是纯英文和数字,用char/varchar。如果含有中文字符或其它多国语言,用 nchar/nvarchar。3.字段长度要精确,遵守“必须、够用”的原则。名师资料总结-精品资料欢迎下载-名师精心整理-第 7 页,共 37 页 -精确的长度设计既能完整的描述
13、数据,又可以节省存储空间。积小成大,当数据表中的数据有很多记录的时候,这种存储空间的优势就能体现得十分明显。存储空间越紧凑,分配的页面就越少,在同样大小的内存空间中就可以存储更多的页面,这样操作数据的效率就会提高。例如能用 char(10)的就不要用 char(20),提高存储的利用率和系统性能,但同时也要兼顾扩展性和可移植性。字段类型存储空间补充说明bigint 8 字节-263(-9,223,372,036,854,775,808)到263-1(9,223,372,036,854,775,807)int 4 字节-231(-2,147,483,648)到 231-1(2,147,483,6
14、47)smallint 2 字节-215(-32,768)到 215-1(32,767)tinyint 1 字节0 到 255 decimal(9,2)5 字节decimal(9,2)前面的 9 为精度,后面为小数位。当精度位于19 之间时,占5 字节。当精度位于1019 之间时,占 9字节。注意,numeric 在功能上等价于decimal。decimal(19,2)9 字节money 8 字节-922,337,203,685,477.5808 到 922,337,203,685,477.5807 smallmoney 4 字节-214,748.3648 到 214,748.3647 dat
15、etime 8 字节精确到 3.33 毫秒。例如:2014-03-07 17:25:39.450 存储范围:1753 年 1 月 1 日到9999 年 12 月 31 日smalldatetime 4 字节精确到分钟,例如:2014-03-07 17:24:00 存储范围是:1900 年 1 月 1 日到2079 年 6 月 6 日uniqueidentifier 16 字节uniqueidentifier 数据类型可存储16 字节的二进制值,其作用与全局唯一标识符(GUID)一样。(CHAR(36)bit 1 字节取值范围:0 或 1。char(n)N 字节varchar(n)实际存储的每个
16、字符占1 字节nchar(n)2xN 字节nvarchar(n)实际存储的每个字符占2 字节在存储空间一样的情况下,字符串数据类型需要字符串匹配操作,这通常比整数匹配操作的开销要大。所以尽量选择整数作为字段类型。3.2.3 适当的合理的冗余降低范式标准的一个重要原因是为了在检索数据时少连接表从而提供一个性能优势。或是预先汇总计算结果并存放起来,或是将相同字段内容一式多份地放在多个表中,这样数据的冗余会增加开发人员的工作量和业务判断。(最好是对有冗余的字段要另外用文档统一说明)完全按照规范化设计的系统几乎是不可能的,除非系统特别的小,在规范化设计后,有计划地加入名师资料总结-精品资料欢迎下载-名
17、师精心整理-第 8 页,共 37 页 -冗余是必要的。冗余可以是冗余数据库、冗余表或者冗余字段,不同粒度的冗余可以起到不同的作用。冗余可以是为了编程方便而增加,也可以是为了性能的提高而增加。从性能角度来说,冗余数据库可以分散数据库压力,冗余表可以分散数据量大的表的并发压力,也可以加快特殊查询的速度,冗余字段可以有效减少数据库表的连接,提高效率。数据库设计阶段,对必要的冗余处理可以事先安排设计,如果在代码实现阶段发现一些必要的冗余字段可以及早提出来考虑。3.2.4 注意大类型的字段设计如果设计过程中发现表中存在大类型(可存储 2G)的字段时,要慎重考虑,因为这样的字段会造成单一数据页存放不了几条
18、记录。而过多的页面也会在查询扫描时带来性能影响。一般的做法是将XML、IMAGE、VARCHAR(MAX)、NVARCHAR(MAX)或 TEXT 类型的字段切割到另外的数据表,而后与主数据表一对一连接。因为这些大型数据访问缓慢,修改时可能造成记录锁定较久。且在大多数的使用状态下,查询一般字段内容时可能根本用不到这些字段。这些列的存在会增加表的页面数,不分割出去容易会影响其它字段的修改和查询。VARCHAR(MAX)、NVARCHAR(MAX)字段如果实际长度在8000 以下,这个值将被作为常规的变长数据类型来对待,如果超过8000 个字节,SQL Server将该值作为TEXT 来存储处理。
19、如果该表数据量比较大时,一定要考虑大字段分离设计原则。少用 TEXT 和 IMAGE,二进制字段的读写是比较慢的。3.3 表关系和约束设计正确处理表间关系。一对多、一对一、多对多等关系。主外键关系是保证数据完整性的一个重要机制。维护数据的正确性。尽量采用提供的约束,如主外键、检查、默认值、不可NULL 等。尽可能不要通过程序或存储过程、触发器等机制来运行,毕竟SQL SERVER 约束是在内部以优化过的二进制程序名师资料总结-精品资料欢迎下载-名师精心整理-第 9 页,共 37 页 -代码来实现的,而其它方式效率当然不如直接设置的约束高。还有,能够确定具有唯一值的字段上尽量加上唯一性约束。一些
20、约束在客户端判断的确是可以减少服务器的资源,但是不能完全保证数据的错误产生。而且用数据库使用域和参照完整性有时候还能帮助优化器减少查询执行时间。域和参照完整性帮助优化器分析有效的数据值而不需要物理访问数据,这减少了查询时间。3.3.1 主键设计所有的表必须设置主键。主键跟聚焦索引没有什么关系,但主键必须要有索引。主键的选择原则:1.字段值唯一。2.不可 NULL。3.字段大小尽量最小。4.字段值不常变更。5.不建议用复合主键。主健值过大会影响外健数据表的大小。如果主键是聚集索引,由于所有非聚集索引都会存储聚集索引的键值,所以主键值过大,还将导致其他索引结构的效率不佳(页面数)。主键关乎着数据的
21、正确性与完整性。而聚焦索引是从数据的运行效率出发。虽然主键跟聚集索引是两回事,但基于主键的上述特性,所以主键往往适合作为表的聚集索引,这也是微软的默认做法。但一些没有意义的ID 做聚集索引的意义不大,这时候需要在创建表的时候给主键指定为唯一的非聚集索引。-主键约束(非聚集索引):ALTERTABLEdbo.TCustomerADDCONSTRAINT PK_TCustomerPRIMARYKEYNONCLUSTERED(ID);选择 GUID 做为主键时在系统对接、移值和代码编写下都提供了很大的方便,但它是建立在牺牲性能的基础上。在实际运用中,如果对于用36 字符的 GUID 当作主键时,应当
22、注意的问题如下:1.GUID 是无序的,所以不适合用来做聚集索引。否则会引起频繁的页面移动而产生大量的碎片。2.GUID 类型的存储可以由char(36)改为 uniqueidentifier类型(16 个字节),以节省存储空间。3.对于有关联的表之间,考虑程序方便可用使用GUID 做为主键,但对于独立的表,还是以INT名师资料总结-精品资料欢迎下载-名师精心整理-第 10 页,共 37 页 -类型的字段做为主键来设计。所以设计阶段要分清哪些必须用GUID 来做主键。3.3.2 外键设计外键的存在会在处理数据时带来麻烦,但实际上这点恰恰是它的好处。外键的存在就最高效的一致性维护方法。所以在表设
23、计时要考虑主外键的设计。如果决定使用外键约束,那么所有人必须遵守严格执行。外键是最高效的一致性维护方法,数据库的一致性要求,依次可以用外键、CHECK 约束、规则约束、触发器、客户端程序,一般认为,离数据越近的方法效率越高。3.3.3 检查约束约束除了 主外键约束、唯一性约束和默认值约束外,还有一类叫检查约束。检查约束是一个识别SQLServer表中每行可接受的列值的规则,检查约束帮助实施域的完整性,域完整性定义了数据库表中列的有效值,检查约束可以验证单列的域完整性,也可以验证多列的域完整性,在单个列上可以有多个检查约束,如果插入或更新的数据违反了检查约束,数据库引擎将暂时停止INSERT 和
24、 UPDATE 操作。CREATETABLE dbo.TEmployee(ID INT,Code VARCHAR(20),Sex CHAR(1)CONSTRAINT Text_Sex_CK CHECK(Sex=FOR Sex=M),-Sex 列 创建相应的约束,其值只能是F 或M 值。Experience INT CONSTRAINT Text_Experience_CK CHECK(Experience=0)-Experience列创建相应的约束,其值必须=0);3.4 索引的设计索引是一把双刃剑,它通常可以加快数据检索数据的同时,往往又会带来额外的资源开销(在insert、update和
25、delete使用时)。有时候这个开销代价甚至超过了查询优化带来的好处。所以,索引的创建是门艺术,要在工作中不断的积累经验和不断的总结。一般来说,建立索引要看数据使用的方式,名师资料总结-精品资料欢迎下载-名师精心整理-第 11 页,共 37 页 -也就是说那些访问数据的SQL 语句经常使用,针对这些经常使用的SQL 语句创建有效的索引还是值得的,但过多的索引又是对于OLTP(在线事务)数据库是不利的。3.4.1 聚集索引和非聚集索引每个表只能有一个聚集索引,因为目录只能按照一种方法进行排序。聚集索引和数据是混为一体的,而非聚集索引是与数据独立分开的。其实,我们的汉语字典的正文本身就是一个聚集索
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据库设计和编码规范分享 2022 数据库 设计 编码 规范 分享
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内