数据库三大范式对数据冗余、更新异常、插入异常、删除异常等问题的解决情况

本文借鉴了范式的作用:消除数据冗余、更新异常、插入异常和删除异常。_Zebulon777_新浪博客

范式作用

范式定义案例数据冗余更新异常插入异常删除异常解决异常方案
消除数据冗余、更新异常、插入异常和删除异常。1NF如果一个关系模式R的所有属性都是不可分的基本数据项,则R∈1NF。

数据库表中的字段都是单一属性的,不可再分。这个单一属性由基本类型构成,包括整型、实数、字符型、逻辑型、日期型等。
 
不满足第一范式就不是关系型数据库!
 假定选课关系表为SelectCourse(学号, 姓名, 年龄, 课程名称, 成绩, 学分),关键字为组合关键字(学号, 课程名称),因为存在如下决定关系:

    (学号, 课程名称) → (姓名, 年龄, 成绩, 学分)

    这个数据库表不满足第二范式,因为存在如下决定关系:

    (课程名称) → (学分)

    (学号) → (姓名, 年龄)

即存在组合关键字中的字段决定非关键字的情况。

    结论:属于1NF
同一门课程由n个学生选修,"学分"就重复n-1次;同一个学生选修了m门课程,姓名和年龄就重复了m-1次。若调整了某门课程的学分,数据表中所有行的"学分"值都要更新,否则会出现同一门课程学分不同的情况。假设要开设一门新的课程,暂时还没有人选修。这样,由于还没有"学号"关键字,课程名称和学分也无法记录入数据库。假设一批学生已经完成课程的选修,这些选修记录就应该从数据库表中删除。但是,与此同时,课程名称和学分信息也被删除了。很显然,这也会导致插入异常。把选课关系表SelectCourse改为如下三个表:

    学生:Student(学号, 姓名, 年龄);

    课程:Course(课程名称, 学分);

    选课关系:SelectCourse(学号, 课程名称, 成绩)。

    这样的数据库表是符合第二范式的,消除了数据冗余、更新异常、插入异常和删除异常。

    另外,所有单关键字的数据库表都符合第二范式,因为不可能存在组合关键字。
2NF若关系模式R∈1NF,并且每一个非主属性都完全函数依赖于R的码,则R∈2NF
 

表中的属性必须完全依赖于全部主键,而不是部分主键。所以只有一个主键的表如果符合第一范式,那一定是第二范式。
假定学生关系表为Student(学号, 姓名, 年龄, 所在学院, 学院地点, 学院电话),关键字为单一关键字"学号",因为存在如下决定关系:

    (学号) → (姓名, 年龄, 所在学院, 学院地点, 学院电话)

这个数据库是符合2NF的,但是不符合3NF,因为存在如下决定关系:

    (学号) → (所在学院) → (学院地点, 学院电话)

即存在非关键字段"学院地点"、"学院电话"对关键字段"学号"的传递函数依赖。

    它也会存在数据冗余、更新异常、插入异常和删除异常的情况
   
同一个院校有n个学生,那么院校地点和院校电话就重复存储了n-1次若更改了某个院校的地点,数据表中院校所属行的地点都要更新,否则就会出现不一致的情况如果某个新的院校里没有学生,那么久无法将该院校插入数据库如果删除了一个院校的所有学生,那么该院校也将被删除掉 把学生关系表分为如下两个表:

    学生:(学号, 姓名, 年龄, 所在学院);

    学院:(学院, 地点, 电话)。

这样的数据库表是符合第三范式的,消除了数据冗余、更新异常、插入异常和删除异常。
3NF在第二范式的基础上,数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则符合第三范式。

所谓传递函数依赖,指的是如果存在"A → B → C"的决定关系,则C传递函数依赖于A。
假设仓库管理关系表为StorehouseManage(仓库ID, 存储物品ID, 管理员ID, 数量),且有一个管理员只在一个仓库工作;一个仓库可以存储多种物品。这个数据库表中存在如下决定关系:

    (仓库ID, 存储物品ID) →(管理员ID, 数量)

    (管理员ID, 存储物品ID) → (仓库ID, 数量)

    所以,(仓库ID, 存储物品ID)和(管理员ID, 存储物品ID)都是StorehouseManage的候选关键字,表中的唯一非关键字段为数量,它是符合第三范式的。但是,由于存在如下决定关系:

    (仓库ID) → (管理员ID)

    (管理员ID) → (仓库ID)

即存在关键字段决定关键字段的情况,所以其不符合BCNF范式。它会出现如下删除、插入、更新异常。

   
一个仓库存储n种物品,则仓库与管理员重复存储了n-1次如果仓库换了管理员,则表中所有行的管理员ID都要修改。否则出现数据不一致如果新建了一个仓库,但是它没有存储物资,那么就无法插入表如果一个仓库下存储的物资都被删除了,那么仓库也将被删除掉 把仓库管理关系表分解为二个关系表:

    仓库管理:StorehouseManage(仓库ID, 管理员ID);

    仓库:Storehouse(仓库ID, 存储物品ID, 数量)。

    这样的数据库表是符合BCNF范式的,消除了删除异常、插入异常和更新异常。
BCNF在第三范式的基础上,数据库表中如果不存在任何字段对任一候选关键字段的传递函数依赖则符合BC范式。
  • 29
    点赞
  • 135
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
数据库范式主要是为解决关系数据库中的数据冗余更新异常插入异常删除异常问题而引入的设计理念。通过应用数据库范式,可以避免数据冗余,减少数据库的存储空间,并且减轻维护数据完整性的成本。范式化的数据库设计可以消除重复数据,减少数据冗余,更好地组织数据库内的数据,并有效利用磁盘空间。然而,范式化的数据库设计也有一些缺点,比如查询变得复杂,需要更多的连接,一些复合索引的列被分割到不同的表中,导致索引策略不佳。因此,在一定程度上,数据库设计有时需要打破范式,引入反范式设计,特别是在高可用的OLTP数据库中。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* [数据库范式](https://blog.csdn.net/weixin_49251429/article/details/124960401)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [数据库数据库范式](https://blog.csdn.net/qq_42192693/article/details/109701075)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值