问答题
阅读以下关于软件系统数据建模的说明,根据要求回答下面问题。
[说明]
某软件公司成立项目组为某高校开发一套教职工信息管理系统。与教职工信息相关的数据需求和处理需求如下。
(1)数据需求:在教职工信息中能够存储学校所有在职的教工和职工信息,包括工资编号、部门编号、职工姓名、出生年月、应发工资和缴税金额;部门信息中包括部门编号、部门名称、部门人数和办公地点信息。
(2)处理需求:能够根据编制内或外聘教职工的工资编号分别查询其相关信息;每个月的月底统一核发工资,要求系统能够以最快速度查询出教工或者职工所在部门名称、实发工资金额;由于学校人员相对稳定,因此数据变化及维护工作量很少。
项目组王工和李工针对上述应用需求分别给出了所设计的数据模型(如图1和图2所示)。王工遵循数据库设计过程,按照第三范式对数据进行优化和调整,所设计的数据模型简单且基本没有数据冗余;而李工设计的数据模型中存在大量数据冗余。
图1 王工设计的数据模型
问答题
请用300字以内的文字,说明什么是数据库建模中的反规范化技术,指出采用反规范化技术能获得哪些益处,可能带来哪些问题。
【正确答案】
【答案解析】规范化设计后,数据库设计者希望牺牲部分规范化来提高性能,这种从规范化设计的回退方法称为反规范化技术。该技术允许保留或者新增一些冗余数据,从而减少数据查询中表连接的数目或简化计算过程,以提高数据访问效率。益处:能够减少数据库查询时SQL连接的数目,从而减少磁盘I/O数据量,提高查询效率。
问题:数据的重复存储,浪费了磁盘空间;为了保障数据的一致性,增加了数据维护的复杂性
数据库规范化理论是研究将一个不合理的关系模式转化为合理的关系模式的理论,通过不同的规范化级别优化数据存储。数据库中的数据规范化的优点表现在:减少了数据冗余,节约了存储空间,相应逻辑和物理的I/O次数减少,同时加快了增、删、改的速度,但是对完全规范的数据库查询,通常需要更多的连接操作,从而影响查询的速度。因此,有时为了提高某些查询或应用的性能而牺牲部分规范化,这种从规范化设计的回退方法称为反规范化技术。换而言之,反规范化设计允许保留或者新增一些冗余数据,从而减少数据查询中表连接的数目或简化计算过程,提高数据访问效率。
采用反规范化技术的益处(但不限于):能够减少数据库查询时SQL连接的数目(即降低连接操作的需求),降低外码和索引的数目,还可能减少表的数目,从而减少磁盘I/O数据量,提高查询效率。反规范化可能带来的问题(但不限于):数据的重复存储,浪费了磁盘空间;为了保障数据的一致性,增加了数据维护的复杂性。维护常用的方法是批处理、应用逻辑和触发器。
综上所述,在决定进行反规范时,一定要权衡利弊,仔细分析应用的数据存取需求和实际的性能特点,好的索引和其他方法经常能够解决性能问题,而不必采用反规范这种方法。反规范化会带来数据的重复存储,浪费了磁盘空间;而且为了保障数据的一致性,增加了数据维护的复杂性。
问答题
请简要叙述常见的反规范化技术有哪些。
【正确答案】
【答案解析】常见的反规范化技术包括:
(1)增加冗余列:在多个表中保留相同的列,通过增加数据冗余减少或避免查询时的连接操作;
(2)增加派生列:在表中增加可以由本表或其他表中数据计算生成的列,减少查询时的连接操作并避免计算或使用集合函数;
(3)表水平分割:根据一列或多列数据的值,把数据放到多个独立的表中,主要用于表数据规模很大、表中数据相对独立或数据需要存放到多个介质上时使用;
(4)表垂直分割:对表进行分割,将主键与部分列放到一个表中,主键与其他列放到另一个表中,在查询时减少I/O次数
在进行反规范操作之前,要充分考虑数据的存取需求、常用表的大小、一些特殊的计算(例如合计)、数据的物理存储位置等。常用的反规范技术有增加冗余列、增加派生列、重新组表和分割表。分割表包括水平分割和垂直分割两种形式。
(1)增加冗余列:在多个表中保留相同的列,通过增加数据冗余减少(或避免)查询时的连接操作。但它需要更多的磁盘存储空间,同时增加了表维护的工作量。
(2)增加派生列:在表中增加可以由本表或其他表中数据计算生成的列,减少查询时的连接操作并避免计算(或使用)集合函数。派生列也具有与冗余列同样的缺点。
(3)重新组表:是指若许多用户需要查看两个表连接出来的结果数据,则把这两个表重新组成一个表来减少连接而提高性能。但需要更多的磁盘存储空间,同时也损失了数据在概念上的独立性。
(4)表水平分割:根据一列或多列数据的值,把数据放到多个独立的表中。它通常在以下情况下使用:①表数据规模很大,分割后可以降低在查询时需要读的数据和索引的页数,同时也降低了索引的层数,提高查询速度;②表中的数据相对独立,例如表中分别记录各个地区的数据或不同时期的数据,特别是有些数据常用,而另外一些数据不常用;③需要把数据存放到多个介质上。水平分割会给应用增加复杂度,它通常在查询时需要多个表名,查询所有数据需要union操作。在许多数据库应用中,这种复杂性会超过它带来的优点,因为只要索引关键字不大,则在索引用于查询时,表中增加两到三倍数据量,查询时也就增加读一个索引层的磁盘次数。
(5)表垂直分割:对表进行分割,将主键与部分列放到一个表中,主键与其他列放到另一个表中,在查询时减少I/O次数。若一个表中某些列常用,而另外一些列不常用,则可以采用垂直分割。另外,垂直分割可以使数据行变小,一个数据页就能存放更多的数据,在查询时就会减少I/O次数。其缺点是需要管理冗余列,查询所有数据需要join操作。
问答题
请分析李工是如何应用反规范化技术来满足教职工信息管理需求的。
【正确答案】
【答案解析】李工所设计的数据模型中采用了以下3种反规范化技术:
(1)增加冗余列:增加“部门名称”列,消除了数据查询中“教职工信息”表和“部门信息”表之间的连接;
(2)增加派生列:增加“实发工资”列,消除了实发工资的计算过程;
(3)表水平分割:将教职工信息表分割为“编制内教职工信息”表和“外聘教职工信息”表,减少了数据查询的范围
依题意,在该教职工信息管理系统的需求中,要求“能够根据编制内或外聘教职工的工资编号分别查询其相关信息”;要求“系统能够以最快速度查询出教工……”。对比王工和李工所设计的数据模型可以发现,在李工所设计的数据模型中:①使用了反规范化的增加冗余列技术,即增加“部门名称”列,消除了数据查询中“教职工信息”表和“部门信息”表之间的连接;②使用了反规范化的增加派生列技术,即增加“实发工资”列,消除了实发工资的计算过程;③使用表水平分割技术将教职工信息表分割为“编制内教职工信息”表和“外聘教职工信息”表,减少了数据查询的范围。