3.1. 反规范的好处 是否规范化的程度越高越好?这要根据需要来决定,因为“分离”越深,产生的关系越多,关系过多,连接操作越频繁,而连接操作是最费时间的,特别对以查询为主的数据库应用来说,频繁的连接会影响查询速度。所以,关系有时故意保留成非规范化的,或者规范化以后又反规范了,这样做通常是为了改进性能。例如帐户系统中的“帐户”表B-TB01,它的列busi-balance(企业帐户的总余额)就违反规范,其中的值可以通过下面的查询获得: select busi-code,sum(acc-balance) from B-TB06 group by busi-code 如果B-TB01中没有该列,若想获得busi-name(企业名称)和企业帐户的总余额,则需要做连接操作: select busi-name,sum(acc-balance) from B-TB01,B-TB06 where B-TB01.busi-code=B-TB06.busi-code group by busi-code 如果经常做这种查询,则就有必要在B-TB01中加入列busi-balance,相应的代价则是必须在表B-TB06上创建增、删、改的触发器来维护B-TB01表上busi-balance列的值。类似的情况在决策支持系统中经常发生。 反规范的好处是降低连接操作的需求、降低外码和索引的数目,还可能减少表的数目,相应带来的问题是可能出现数据的完整性问题。加快查询速度,但会降低修改速度。因此决定做反规范时,一定要权衡利弊,仔细分析应用的数据存取需求和实际的性能特点,好的索引和其它方法经常能够解决性能问题,而不必采用反规范这种方法。
增加冗余列是指在多个表中具有相同的列,它常用来在查询时避免连接操作。例如前面例子中,如果经常检索一门课的任课教师姓名,则需要做class和teacher表的连接查询: select class-name,teacher-name from class,teacher where class.teacher-no=teacher.teacher-no 这样的话就可以在class表中增加一列teacher-name就不需要连接操作了。 增加冗余列可以在查询时避免连接操作,但它需要更多的磁盘空间,同时增加表维护的工作量。