知识卡片

数据冗余引发的插入删除异常与更新不一致

普通读书笔记卡

内容

把学生、课程、选课这类互不相同的信息硬塞进同一张表,表面上”设计简单”, 实则埋下三类相互关联的问题,这也是整个规范化理论要解决的核心动因。 更新不一致是最直观的:如果课程信息随着每次选课重复存储,修改一门课程 的学时,就要同步修改所有选修过它的学生对应的那些行——只要漏改一条, 数据库里就同时存在这门课的两个不同学时,谁也不知道哪个是对的。插入 异常是指某些本该独立存在的信息,因为被绑定在另一份数据上而无法单独 录入——一门还没有学生选修的新课程,因为主码依赖选课记录才能确定, 根本没法插入表中。删除异常与插入异常相反:删除某门课程的最后一条 选课记录,会连带把这门课程本身的名称、学分、学时信息也一起删掉, 即使这门课依然存在,也从数据库里凭空消失了。这三类问题的根源是同一个: 把逻辑上属于不同实体的信息塞进同一张表,导致某个实体的存在与否被 错误地绑定到另一个实体的记录是否存在。理解这一点后就能看出,[[范式 体系1NF-BCNF的层层递进标准及各自消除的冗余类型]]里每一级范式限制 的本质,都是在切断这种不该有的绑定关系。

参考来源

- 位置:《数据库原理(微课版)》第7章《关系数据库规范化理论》7.1节 "数据库规范化"(源文件:_epub-src/index_split_004.html) - 结论依据:原文用学生选课单表设计为例,说明"若有n个学生选修某课程, 课程信息就要随着n个学生的选修存储n次……修改'马克思主义原理'课程的 学时……若未完全修改,则会出现数据不一致……当对某一门课程删除所有 选课的信息,那么这门课程的名称、学分、学时信息就消失了……若一门 课程还没有学生选修,也无法插入此表",因此可以推出数据冗余导致的 更新不一致、删除异常、插入异常三类问题。 - 原始内容:若有n个学生选修某课程,课程信息就要随着n个学生的选修 存储n次……当对某一门课程删除所有选课的信息,那么这门课程的名称、 学分、学时信息就消失了……若一门课程还没有学生选修,也无法插入此表。