数据库范式

本文详细介绍了数据库设计中的第一范式(1NF)、第二范式(2NF)、第三范式(3NF)以及BC范式(BCNF)和第四范式(4NF)。通过实例解释了各个范式的概念、特点和存在的问题,强调了满足更高范式可能导致的查询复杂性和性能下降。通常,满足3NF即可有效避免数据冗余和异常,但在实际应用中需根据具体情况权衡。
摘要由CSDN通过智能技术生成


一:数据库范式:

1、第一范式(1NF)

特点:每一列保持原子特性

列都是基本数据项,不能够再进行分割,否则设计成一对多的实体关系。例如表中的地址字段,可以再细分为省,市,区等不可再分割(即原子特性)的字段,如下:

示例:

  • 学生表(学号、用户名、性别、年龄,地址)
    例:陕西省西安市西安财经大学
    例:陕西省西安市长安区常宁大街西安财经大学
    地址信息还包含省市区可以拆分
  • 拆分改造后:
    学生表(学号、用户名、性别、年龄、地址ID)
    地址表(地址ID、省、市、区、街道、学校)

注意,不符合第一范式不能称作关系型数据库。

 

 

 

2、第二范式(2NF)

特点:非主属性完全依赖于主键(主要针对联合主键→消除部分依赖)

符合第一范式的基础上, 非主属性完全依赖于主关键字,如果不是完全依赖主键,应该拆分成新的实体,设计成一对多的实体关系。

示例:

  • 学生选课表(学生ID、学生姓名、学生性别、课程ID、课程成绩)
    主键(学生ID、课程Id)
    学生姓名→学生ID →部分依赖
    学生性别→学生ID →部分依赖
    课程成绩→(学生ID、课程id)→完全依赖
  • 拆分改造后:
    学生表(学生ID、学生姓名、学生性别) 主键:学生ID
    课程成绩表(课程ID、学生ID、成绩) 主键:(课程ID、学生ID)

拆分改造前由于不符合2NF,这个学生选课表会存在如下问题:

  1. 数据冗余:
    同一名学生选了n门课程,姓名和性别就重复了n-1次。
  2. 更新异常:
    若调整了某名同学的姓名或者性别,数据表中所有行的姓名或性别值都要更新,否则会出现同一ID姓名或性别不同的情况。
  3. 插入异常:
    假设有一名新学生还没有选课。这样,由于还没有“课程ID”关键字,学生的个人信息也无法记录入数据库。
  4. 删除异常:
    假设有一名因学生考试作弊课程成绩被删除,则该学生个人信息也被删除。

 

 

 

3、第三范式(3NF)

特点: 属性不依赖于其它非主属性(消除依赖传递)

基于第二范式的基础, 非主属性只依赖于主属性。

要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。

示例:

  • 学生表(学生ID、学生姓名、学生性别、学院id、学院电话)
    主键:学生ID
    学生姓名→学生ID
    学生性别→学生ID
    学院名称→学生ID
    学院电话 → 学生ID → 查询学院id → 查询学院电话
  • 拆分改造后:
    学生表:(学生ID、学生姓名、学生性别、学院ID)主键:学生ID
    学院表:(学院ID、学院名称、学院电话) 主键:学院ID

拆分改造前由于不符合3NF,这个学生选课表会存在如下问题:

  1. 数据冗余:
    有n名学生,则学院id和学院电话就被重复了n次。
  2. 更新异常:
    若调整了学院电话,数据表中所有行的学院电话值都要更新,否则会出现同一学院id学院电话不同的情况。
  3. 插入异常:
    假设有一个学院没有电话,这样,由于还没有“学院电话”关键字,学生的个人信息也无法记录入数据库。
  4. 删除异常:
    假设有一学院暂时取消了学院电话,则该学生个人信息也被删除。

注意:一般关系型数据库满足第三范式就可以了!

4、BC范式(BCNF)

特点:每个表中只有一个候选键

基于第三范式的基础上, 每个表中只有一个候选键。(不重复的属性称为候选键)

示例:

  • 仓库管理关系表为StorehouseManage(仓库ID, 存储物品ID, 管理员ID, 数量),且有一个管理员只在一个仓库工作;一个仓库可以存储多种物品;一个仓库只有一个管理员。
     
    主键:(仓库ID,管理员ID, 存储物品ID)
    (仓库ID,管理员ID, 存储物品ID) → 数量
    但是我们发现:
    (仓库ID, 存储物品ID) →(管理员ID, 数量)
    (管理员ID, 存储物品ID) → (仓库ID, 数量)

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

  1. 数据冗余:
    同一个仓库存储n物品时,管理员ID就要被重复n-1次。
  2. 删除异常:
    当仓库被清空后,所有”存储物品ID”和”数量”信息被删除的同时,”仓库ID”和”管理员ID”信息也被删除了。
  3. 插入异常:
    当仓库没有存储任何物品时,无法给仓库分配管理员。
  4. 更新异常:
    如果仓库换了管理员,则表中所有行的管理员ID都要修改。
  • 把仓库管理关系表分解为二个关系表:
     
    仓库管理:StorehouseManage(仓库ID, 管理员ID);
    仓库:Storehouse(仓库ID, 存储物品ID, 数量)。

这样的数据库表是符合BCNF范式的,消除了异常。

5、第四范式(4NF)

特点:消除表中的多值依赖
基于BC范式的基础上, 要消除表中的多值依赖,也就是说可以减少维护数据一致性的工作。

示例:

  • 课程表
课程id教材id课程名称
11数学
22语文
  • 教材表
教材id教材名称
1人教版数学
2人教版语文,苏教版语文

这样两本一个教材id就对应两个语文教材。修改办法如下

课程id教材id课程名称
1101数学
2201语文
教材id教材名称
101人教版数学
201人教版语文
202苏教版语文

二:总结

从上面对于数据库范式进行分解的过程中不难看出,应用的范式越高,表越多。表多会带来很多问题:

  1. 查询时需要连接多个表,增加了SQL查询的复杂度
  2. 查询时需要连接多个表,降低了数据库查询性能

因此,并不是应用的范式越高越好,要看实际情况而定表越多,多表联合查询的几率就越大,SQL查询的效率就变低。第三范式已经很大程度上减少了数据冗余,并且基本预防了数据冗余,插入异常,更新异常,和删除异常了。

应用数据库范式可以带来许多好处,但是最重要的好处归结为三点:

  1. 减少数据冗余(这是最主要的好处,其他好处都是由此而附带的)
  2. 消除异常(插入异常,更新异常,删除异常)
  3. 让数据组织的更加和谐…
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值