NOIP 普及组初赛 · NOIP 2007 普及组初赛试题 第 8 题

选择题 · 答案 C · 考点:数据库基础概念

← 整套速查表 NOIP 普及组初赛 全部真题

题目

冗余数据是指可以由其它数据导出的数据。例如,数据库中已存放了学生的数学、语文和英语的三科成绩,如果还存放三科成绩的总分,则总分就可以看作冗余数据。冗余数据往往会造成数据的不一致。例如,上面 $4$ 个数据如果都是输入的,由于操作错误使总分不等于三科成绩之和,就会产生矛盾。下面关于冗余数据的说法中,正确的是(  )。

答案:C

考点

数据库基础概念

解题思维

这道题考查数据库设计中的冗余数据与范式化权衡。拿到题先想:冗余是利是弊?完全消除虽然一致性好,但查询效率会下降;保留冗余是为了空间换时间,但更新时必须做相容性检验,否则数据会打架。

常见错误

最容易犯的错误是选A,觉得冗余就是坏事,必须彻底消灭,这是理想化的教科书观点,实际工程中为了查询效率往往要保留。其次是选D,以为冗余数据不用管,更新时不做检查,这直接导致数据不一致。还有同学会误选B,认为高级语言比关系数据库更容易消除冗余,其实关系数据库的范式化设计(如3NF)恰恰是专门用来解决冗余问题的,反而更容易。

详细解析(节选)

这道题考查的是数据库基础概念中的冗余数据与范式化设计,属于计算机基础知识范畴。在NOIP普及组初赛中,这个知识点虽然只考过2次(2007年),但非常经典,命题人喜欢用具体的例子(比如总分等于三科之和)来引出抽象概念,然后让你判断哪种说法正确。这类题目往往没有绝对的对错,而是考察你对实际工程权衡的理解。

首先,我们要搞懂什么是冗余数据。简单说,冗余数据就是可以由其他数据推导或计算出来的重复数据。比如题目里举的例子,学生数据库里存了数学、语文、英语三科成绩,如果还存了总分,这个总分就是冗余数据。冗余数据有两面性:一方面,它占用了额外的存储空间,而且如果更新不及时,很容易导致数据不一致(比如三科成绩改了,总分没改,数据就矛盾了);另一方面,保留冗余数据可以提高查询效率,因为不需要每次都把多张表连接起来计算,这就是典型的“空间换时间”思想。

接下来看数据库范式化。范式化是数据库设计的核心原则,目的是消除冗余。第一范式要求列不可再分,第二范式消除部分函数依赖,第三范式消除传递函数依赖。遵循范式化设计,理论上可以消除大部分冗余。但是,在实际工程应用中,为了追求极致的查询性能,我们常常需要进行“反范式化”,也就是故意保留一些冗余数据。这时候,为了保证数据不出现矛盾,我们就必须做相容性检验(Consistency Check)。当更新冗余数据时,系统要检查所有副本是否一致,确保数据完整性。

现在我们来逐项分析选项。选项A说“应该在数据库中消除一切冗余数据”,这个说法太绝对了。虽然消除冗余能保证数据一致性,但会牺牲查询效率,实际工程中很少能做到“一切”冗余都消除,所以A错误。选项B说“用高级语言编写的数据处理系统,通常比用关系数据库编写的系统更容易消除冗余数据”,这个也是错的。关系数据库提供了完整的范式化设计工具(如3NF),反而更容易消除冗余,高级语言系统通常需要程序员自己写代码来管理依赖关系,更容易出错,所以B错误。选项D说“可以不理睬数据库中的冗余数据”,这更是大错特错。如果不做相容性检验,冗余数据更新后就会不一致,导致系统错误,绝对不能不理睬,所以D错误。只有选项C说“为了提高查询效率,在数据库中可以保留一些冗余数据,但更新时要做相容性检验”,这完全符合实际工程实践,既考虑了性能,又保证了数据一致性,因此C是正确的。

总结一下,这道题的考点在于理解冗余数据的利弊权衡:保留冗余是为了空间换时间,提高查询效率;但保留冗余就必须做相容性检验,否则数据会不一致。命题人挖的坑主要在“绝对化”的表述(如“一切”、“可以不理睬”)以及混淆不同系统的特性(如高级语言与关系数据库在消除冗余上的难易程度)。希望同学们以后遇到这类题目,不要死记硬背,要从实际应用场景出发,理解数据设计背后的权衡思想。

同考点真题

在 OI伴学 里做这道题
登录后可计时作答、查看完整六段式解析,并按你的错题自动生成同类练习。
去刷题先做一次 AI 学情诊断