数据库的规范化及反规范化设计
摘要:数据库规范化是数据库设计中的一系列原理和技术,以减少数据库中数据冗余,增进数据的一致性。但在实际应用中,数据库的规范化会使查询时连接表操作增加,性能降低,所以常常对数据库进行反规范化处理。本文主要讲述数据库设计中常用的规范化和反规范化方法。
关键词:数据库设计;规范化;反规范化
中图分类号:tp311.13 文献标识码:a 文章编号:1674-7712 2013 02-0061-01
一、引言
作为应用程序设计的基础,数据库设计自身的性能可以对应用程序的性能造成直接的影响。关系数据库设计是对数据进行组织化和结构化的过程,核心是关系模式的设计。
目前,在指导关系模式的设计中规范化设计处于主导的地位,这是数据库数十年地发展中产生并得到广泛应用的结果。但数据库的规范化使得查询越来越复杂,对数据的查询性能有较大影响,所以近年来这一领域出现了一种新的趋势,一种称为非规范化的关系模式设计引起业界的关注并已在一定的范围内得到应用。
二、数据库的规范化设计
(一)范式概述。一般情况下我们将关系模式进行分解,用等价的关系子模式来取代原有的关系模式,以此来去除数据依赖中不合理的部分,这就是关系模式规范化设计的基本思想。这一过程必须在连接、函数依赖都不受到影响的前提下进行,也就是说必须确保原有数据的完整性,而且分解后的关系通过自然联接也可以使原有关系复原。
规范化设计的过程就是按不同的范式,将一个二维表不断地分解成多个二维表并建立表之间的关联,最终达到一个表只描述一个实体或者实体间联系的目标。目前遵循的主要范式包括1nf2nf3nfbcnf4nf5nf等几种。在工程中3nfbcnf应用最广泛,推荐采用 3nf作为标准。
(二)1nf1nf是关系模式的最低要求,是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。如果出现重复属性,就可能需要定义一个新的实体,新的实体由重复属性构成,新实体与原实体之间为一对多关系。
(三)2nf。满足2nf必须先满足1nf2nf要求实体的属性完全依赖于主关键字。所谓完全依赖是指不存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。
(四)3nf。满足3nf必须先满足2nf3nf要求实体的每个非主属性都不传递依赖于关系模式的关键字,即要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。
三、数据库的反规范化设计
(一)反规范化的必要性。数据库规范化可有效地避免数据的冗余,保持数据库的完整性,提高系统的性能,但在查询过程中,连接操作较为复杂,这样就要占用较多的cpu资源和输入输出操作,会导致复杂度的增加和性能的下降,这样一来便会使得查询速度降低。有时为了提高某些查询或应用的性能便会破坏规范化,特别在网络环境中,有必要对规范化进行必要的平衡,使系统有最优的性能,提高数据库的网络性能,即反规范。
(二)常用的反规范技术。1.增加冗余列。有时候我们可以通过在其中一个表上增加若干冗余列,来避免两个或多个表在需要连接时之间的连接过于频繁。但它需要较多的磁盘空间,
同时增加工作量来进行表的维护。2.增加派生列。派生列是将表中的其它多个列计算所得到的,增加派生列可有效地减少统计运算,大大缩短我们在进行数据汇总时的运算时间。同样的,派生列也具有冗余列的缺点。sql包含哪几个部分3.重新组表。重新组表指在我们需要查看两个表连接出来的结果数据时,通过重组表来减少连接从而提高性能。但这样一来便会消耗更多的磁盘空间,也会损失数据在概念上的独立性。4.分割表。表分割包括水平分割和垂直分割。将一个表按照行分割为多个表称之为水平分割。水平分割一般运用在以下情况:表很大,进行水平分割后可以降低在查询时涉及到的数据和索引的页数及层数,进而提高查询的速度;表中的数据具有独立性,例如表中记录不同地区或不同时期的数据,这些数据有些常用有些不常用;需要把数据保存到多个介质上。水平分割增加应用的复杂度,在查询时需要多个表名,查询数据需要union操作。在数据库应用中,这种复杂性往往会超过它自身的优点,因为只要我们索引的关键字不大,将索引应用于查询时,随着表中数据量增加两到三倍,也就会增加读一个索引层的磁盘次数。
对于一个列很多的表,假如某些列的访问率明显高于其它列,就可以将它们和主键作为一个表,将其它列和主键作为另外一个表,这就称为垂直分割。垂直分割可以减少数据行,这样一来,一个数据页就能存放更多的数据,查询时就会减少i/o次数。垂直分割的缺点是需要管
理冗余列,查询数据需要join操作。
(三)反规范技术需要维护数据的完整性。不管我们采用哪种反规范技术,都需要对维护数据的完整性进行一定的管理,通常我们采取批处理维护、应用逻辑和触发器。批处理维护是当复制列或派生列的修改累积到了一定时间后,运行一批处理作业或存储过程对其进行修改,在对实时性要求较低的情况下可以采取这种方法。数据的完整性也能通过应用逻辑来实现,这便要求我们必须在同一事务中对所有涉及到的表进行修改操作。由于同一逻辑必须在所有的应用中使用和维护,会产生遗漏,尤其是在需求变化时维护就更加困难。因此采取应用逻辑来实现数据完整性有较大的风险。此外我们还可以使用触发器,对数据的修改即时触发复制列或派生列的相应修改。触发器具有实时性,而且相应的处理逻辑只会出现在一个地方,便于维护,因此是解决这类问题的最好办法。
四、结束语
规范化后的表一般都较小,小的表意味着一个数据页中可以包含较多的记录,这样客户端用户就可在同样的时间内获得所需的更多数据记录,从而减少客户端与服务器端的物理输入与输出,减轻网络的负担。反规范的优点是降低连接过程中的操作需求、外码和索引的数目,
某些情况下还可以减少表的数目。与此同时反规范化的缺点也很明显,它可能会影响数据的完整性,会降低修改速度。在我们决定做反规范时,一定要仔细分析问题的利弊,认真考量应用的数据存取需求以及实际的性能,解决性能问题我们也可以通过好的索引和其它方法,而不一定非要采用反规范。
参考文献:
[1]萨师煊,王珊.数据库系统概论[m].高等教育出版社,2000.
[2]尹为民.现代数据库系统及应用教程[m].武汉大学出版社,2005.