您的位置:首页 > 数据库

数据库设计规范(四)

2010-10-21 10:10 176 查看
[align=left]上次和大家分享了数据库设计规范(三),今天继续为大家分享数据库设计规范(四)主要从性能优化的角度来分析数据库设计规范。[/align]
[align=left]本规范涉及的数据库对象包括:数据库、数据表、字段、视图、函数、存储过程、触发器、索引。
每一个数据表必须指定一个主键。如果数据本身没有明显的主键,可增加一个唯一键列作为主键,数据类型可以是uniqueidentifier或自动增长的整数。
字符型字段尽可能使用可变长的字符类型。在长度的设定时要考虑到不可预见性及未来可能的变化,取一个比较宽松的长度,避免长度变化产生的关联改变。
对于类似金额=数量*单价的形式,如果表中保存了数量和单价,则金额设置为计算列,可保证计算结果的唯一性,又可保证数据的完整性。
在如下情况下,允许保留字段冗余,在数据库设计时违反关系数据库范式规定:
只保存代码时,录入界面无法呈现其名称,为方便操作,此时允许在表中加入名称列。但当编码表中名称变更时,要有相应的程序完成名称的同步。在引用该表数据时不使用其名称列,名称取自编码表。如在销售订单中表中同时存在客户的编码和名称列。
当两个有所属关系的列,其所属关系会发生变化时,在表中允许同时保留这两列,记录数据发生时的所属关系。如城市和所属销售区域;计算结果值与其相关参数。[/align]
[align=left]对于数据需要人工录入或导入的表,需要附加足够的约束以保证系统数据的完整性。
有如下的方式可采用:
列级约束
不允许空NOT NULL
缺省值DEFAULT
数据类型(长度,小数位)
检查约束CHECK(列表、like)
唯一值约束UNIQUE
表级约束
主键约束PRIMARY KEY
关系(外键)约束FOREIGN KEY
规则RULE(列间取值关系)
唯一索引:对于有唯一性要求的非主键列(或列的组合),需要建立唯一索引。
使用触发器:对于较复杂的约束,使用触发器检查和事务回滚完成。
使用存储过程:对于复杂并耗时,不便用触发器实现的,可使用存储过程定时检查,自动或人工排除错误。
数据检查和约束:复杂表级约束、表间约束。
记录变更:记录变更,其他程序可以应用进行数据的更新;查询数据的变化历史。
关联更新:对指定的表中的相关列作同步,或进行实时地累计计算
弱化使用者与表物理结构间的关联,减少因表结构修改引起的关联对象的维护。
统一数据源。当一种固定的数据组合算法被经常引用时,通过视图可以统一算法、格式,减少算法变化引起关联对象的维护。
增强复用,简化编程。将常用的算法或数据组合固定到视图,编程时引用可简化程序结构,提高变成效率。
除编辑数据外,对业务数据的引用原则上都要通过视图。
对多处引用的算法或数据组合使用视图,提高变成效率,减少维护量。
对于大数据表,使用分区视图,优化查询性能。
需要返回值或列表,便于其他程序引用。
固化程序段便于多次复用。
与视图相比,可使用参数,可使用临时表进行多步骤复杂运算,除返回列表外还可返回值。
与存储过程相比,表函数可以像表一样被引用,值函数可以像常量一样被引用。
与视图使用同样的目的,但不能用视图实现时。
对重复使用的程序段,提高复用性,统一数据源和算法。
对需要写入永久表的应使用存储过程。
不需要返回值或列表要其它程序引用,处理结果直接存入表或前台展示。
替代函数编写函数所不能处理的代码。
对重复使用的程序段,提高复用性,统一算法。
适用于处理复杂计算并写入结果表或直接列表显示的情况。
当对一个以上表进行处理(新增,删除或修改)时,应将这个步骤包含在一个处理事务中,以便出错时回滚,保持数据的完整性。
对出错信息要统一编码管理,便于准确报告错误及错误的跟踪处理。
除非必要请不要使用游标,而使用SELECT字段列表中调用函数的方式代替。[/align]
[align=left]经常在where字句中引用的列,如果有大数量的不同值可以建索引。只有小数目的不同值的列不宜建索引
聚集索引:因为顺序访问最常见的是按时间范围,所以选择与数据时间相关的列作为聚集索引。不要使用会更新的列。
组合索引:最常使用的列排在最前面,因为在where中只有包含了前序的列,后续列的索引才会起作用。[/align]
[align=left]对于数据量巨大的表(暂且规定为百万级),可按年度建表,用分区视图查询。这样做可在不改变代码的前提下加快查询速度。[/align]
[align=left]完全按照规范化设计的系统几乎是不可能的,除非系统特别的小,在规范化设计后,有计划地加入冗余是必要的。冗余可以是冗余数据库、冗余表或者冗余字段,不同粒度的冗余可以起到不同的作用。冗余可以是为了编程方便而增加,也可以是为了性能的提高而增加。从性能角度来说,冗余数据库可以分散数据库压力,冗余表可以分散数据量大的表的并发压力,也可以加快特殊查询的速度,冗余字段可以有效减少数据库表的连接,提高效率。[/align]
[align=left]主键是必要的,SQL SERVER的主键同时是一个唯一索引,而且在实际应用中,我们往往选择最小的键组合作为主键,所以主键往往适合作为表的聚集索引。聚集索引对查询的影响是比较大的,这个在下面索引的叙述。在有多个键的表,主键的选择也比较重要,一般选择总的长度小的键,小的键的比较速度快,同时小的键可以使主键的B树结构的层次更少。主键的选择还要注意组合主键的字段次序,对于组合主键来说,不同的字段次序的主键的性能差别可能会很大,一般应该选择重复率低、单独或者组合查询可能性大的字段放在前面。[/align]
[align=left]外键是最高效的一致性维护方法,数据库的一致性要求,依次可以用外键、CHECK约束、规则约束、触发器、客户端程序,一般认为,离数据越近的方法效率越高。谨慎使用级联删除和级联更新,级联删除和级联更新作为SQL SERVER 2000当年的新功能,在2005作了保留,应该有其可用之处。因为级联删除和级联更新有些突破了传统的关于外键的定义,功能有点太过强大,使用前必须确定自己已经把握好其功能范围,否则,级联删除和级联更新可能让你的数据莫名其妙的被修改或者丢失。从性能看级联删除和级联更新是比其他方法更高效的方法。[/align]
[align=left]字段是数据库最基本的单位,其设计对性能的影响是很大的。需要注意如下:
A、数据类型尽量用数字型,数字型的比较比字符型的快很多。
B、数据类型尽量小,这里的尽量小是指在满足可以预见的未来需求的前提下的。
C、尽量不要允许NULL,除非必要,可以用NOT NULL+DEFAULT代替。
D、少用TEXT和IMAGE,二进制字段的读写是比较慢的,而且,读取的方法也不多,大部分情况下最好不用。
E、自增字段要慎用,不利于数据迁移。[/align]
索引的设计:
A、根据数据量决定哪些表需要增加索引,数据量小的可以只有主键。
B、根据使用频率决定哪些字段需要建立索引,选择经常作为连接条件、筛选条件、聚合查询、排序的字段作为索引的候选字段。
C、把经常一起出现的字段组合在一起,组成组合索引,组合索引的字段顺序与主键一样,也需要把最常用的字段放在前面,把重复率低的字段放在前面。
D、一个经常插入更新的表不要加太多索引,因为索引影响插入和更新的速度。
E、一个多用于查询的表可以适量增加索引,保证查询效率,例如报表系统。

关于数据库设计规范更多内容可以访问OECP社区
本文出自 “oecp社区” 博客,谢绝转载!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: