软考架构师:数据库的范式

软考架构师:数据库的范式

😄生命不息,写作不止

🔥 继续踏上学习之路,学之分享笔记

👊 总有一天我也能像各位大佬一样

🏆 博客首页 @怒放吧德德 To记录领地 @一个有梦有戏的人

🌝分享学习心得,欢迎指正,大家一起学习成长!

🏆AI : Grok

转发请携带作者信息 @怒放吧德德(掘金) @一个有梦有戏的人(CSDN)

问题 1:数据库的范式

提问:

数据库的范式

一、AI 讲解

数据库的范式(Normalization)是数据库设计中的一个重要概念,它是为了减少数据冗余、避免更新异常,并保持数据一致性而提出的规则。简单来说,范式就像是给数据库表"瘦身"和"整理"的标准,让数据存储更高效、更可靠。范式从低到高逐步加强,每一个更高的范式都必须满足前一个范式的要求。

下面,我用通俗的语言讲解常见的范式,包括1NF(第一范式)、2NF(第二范式)、3NF(第三范式)和BCNF(Boyce-Codd范式)。我会先用表格呈现每个范式的定义、要求和例子,然后补充一些总体说明。

范式 定义和要求 例子
1NF(第一范式) 表中的每个属性(列)必须是原子值,不能是集合或多值;简单说,就是每个单元格只能放一个值,不能放列表或数组。 假设有一个学生表:学生ID、姓名、电话。如果电话列放"123456,789012",这就不符合1NF;应该拆分成多行或单独表,比如学生ID=1,姓名=张三,电话=123456;另一行学生ID=1,姓名=张三,电话=789012。
2NF(第二范式) 必须先满足1NF;此外,非主键属性必须完全依赖于整个主键,不能部分依赖(如果主键是复合的)。通俗地说,非主键列不能只依赖主键的一部分。 订单表:主键(订单ID + 商品ID),属性:订单日期、商品名称。如果商品名称只依赖商品ID(不依赖订单ID),这就不符合2NF;应该把商品名称拆到单独的商品表中。
3NF(第三范式) 必须先满足2NF;此外,非主键属性不能传递依赖于主键(即非主键之间不能有依赖关系)。简单说,非主键列不能互相依赖。 员工表:员工ID(主键)、部门ID、部门名称。如果部门名称依赖部门ID(而部门ID依赖员工ID),这就不符合3NF;应该把部门ID和部门名称拆到部门表中。
BCNF(Boyce-Codd范式) 必须先满足3NF;此外,任何决定因素**(能决定其他属性的属性)都必须是候选键**。通俗地说,消除主属性对码的部分和传递函数依赖。 教授教课表:(教授ID + 课程ID)为主键,属性:学生ID。如果教授ID决定课程ID,但教授ID不是候选键,这就不符合BCNF;需要进一步拆表。

这些范式的好处是减少冗余,比如在不范式化的表中,更新一个数据可能需要改多处,容易出错。缺点是查询时可能需要更多JOIN操作,影响性能,所以实际设计时有时会反范式化(denormalization)来优化。

举个整体例子:想象一个图书馆借书系统。如果不范式化,表可能重复存书名、作者等;范式化后,书表单独存书信息,借书表只存借书记录,减少重复。

二、AI 出题

(1)题目

  1. 数据库范式设计的主要目的是什么?
    A. 增加数据冗余
    B. 减少数据冗余和异常
    C. 提高查询复杂度
    D. 降低数据安全性
  2. 第一范式(1NF)的要求是什么?
    A. 非主键属性完全依赖主键
    B. 每个属性都是原子值
    C. 消除传递依赖
    D. 所有决定因素都是候选键
  3. 如果一个表的主键是复合键(如A+B),但某个非主键属性只依赖A,这违反了哪个范式?
    A. 1NF
    B. 2NF
    C. 3NF
    D. BCNF
  4. 第三范式(3NF)在第二范式的基础上增加了什么要求?
    A. 属性原子性
    B. 部分依赖消除
    C. 传递依赖消除
    D. 复合主键要求
  5. BCNF范式相对于3NF的加强点是什么?
    A. 要求属性原子值
    B. 消除非主键间的依赖
    C. 所有决定因素必须是候选键
    D. 只处理单主键表
  6. 以下哪个例子不符合1NF?
    A. 表中一列存储多个电话号码,用逗号分隔
    B. 非主键完全依赖主键
    C. 表有复合主键
    D. 表有唯一索引
  7. 在一个学生成绩表中,如果"班级名称"依赖"班级ID",而"班级ID"依赖"学生ID",这违反了哪个范式?
    A. 1NF
    B. 2NF
    C. 3NF
    D. BCNF
  8. 数据库设计中,为什么有时会选择反范式化?
    A. 为了严格遵守范式
    B. 为了提高查询性能
    C. 为了增加数据冗余
    D. 为了简化表结构
  9. 以下关于范式的说法正确的是?
    A. 所有数据库都必须达到BCNF
    B. 更高的范式总是更好的
    C. 范式化可以减少插入、更新和删除异常
    D. 1NF允许多值属性
  10. 如果一个表满足3NF,但有一个非候选键属性决定了另一个属性,这可能违反了哪个范式?
    A. 1NF
    B. 2NF
    C. 3NF
    D. BCNF

(2)答案和解析

  1. 答案:B。
    解析:数据库范式的主要目的是通过规范化表结构来减少数据冗余、避免插入/更新/删除异常,并保持数据一致性。例如,如果不范式化,更新一个人的地址可能需要改多行数据,容易出错;范式化后,只改一处即可。
  2. 答案:B。
    解析:1NF的核心要求是确保表中每个属性的值都是不可分的原子值,不能是集合或列表。例如,不能在一列中放"苹果,香蕉",而应拆分成多行或多列。这是最基本的范式,其他范式都以此为基础。
  3. 答案:B。
    解析:这描述了部分函数依赖,即非主键属性只依赖复合主键的一部分,违反了2NF的要求。2NF要求非主键必须完全依赖整个主键。例如,在(订单ID + 商品ID)为主键的表中,商品价格不能只依赖商品ID。
  4. 答案:C。
    解析:3NF在2NF的基础上要求消除非主键属性之间的传递依赖,即一个非主键不能通过另一个非主键间接依赖主键。例如,员工表中"部门经理"不能通过"部门ID"依赖"员工ID",应拆表。
  5. 答案:C。
    解析:BCNF是3NF的加强版,它要求表中任何函数依赖的左边(决定因素)都必须是候选键,从而消除更多潜在异常。例如,在某些表中,即使满足3NF,如果一个非键属性决定了主键部分,也需调整。
  6. 答案:A。
    解析:用逗号分隔多个电话号码意味着该列不是原子值,违反1NF。1NF要求每个单元格只有一个简单值。其他选项如复合主键或索引与1NF无关。
  7. 答案:C。
    解析:这是典型的传递依赖:"班级名称"依赖"班级ID","班级ID"依赖"学生ID",违反3NF。3NF要求非主键不能互相依赖,应将班级信息拆到单独表中,只在学生表存班级ID。
  8. 答案:B。
    解析:反范式化(denormalization)是有意引入一些冗余来减少JOIN操作,从而提高查询速度。例如,在报表表中重复存一些数据,避免频繁联表查询。虽然增加了冗余,但适合读多写少的场景。
  9. 答案:C。
    解析:范式化确实能减少异常,如插入异常(无法插入不完整数据)。但不是所有数据库都需BCNF(有时3NF够用),更高的范式不总是更好(可能牺牲性能),1NF不允许多值属性。
  10. 答案:D。
    解析:如果满足3NF但有非候选键决定了其他属性,这违反BCNF。BCNF针对这种情况加强,例如在教授-课程表中,如果教授决定了系别,但教授不是候选键,就需调整表结构。

一起学习一起进步,冲,软考高级!!!

相关推荐
Lisonseekpan30 分钟前
MVCC的底层实现原理是什么?
java·数据库·后端·mysql
一勺-_-36 分钟前
全栈:JDBC驱动版本和SQLserver版本是否有关系?怎么选择JDBC的版本号?
数据库·sqlserver
HMBBLOVEPDX1 小时前
MySQL的存储引擎:
数据库·mysql·存储引擎
灰原喜欢柯南1 小时前
实战:MyBatis 中 db.properties 的正确配置与最佳实践
java·数据库·mybatis
水根LP491 小时前
利用微软SQL Server数据库管理员(SA)口令为空的攻击活动猖獗
数据库·microsoft·sqlserver·dba
Starry_hello world2 小时前
MySql 表的操作
数据库·笔记·mysql
山茶花开时。3 小时前
[Oracle] ADD_MONTHS()函数
数据库·oracle
派可数据BI可视化3 小时前
汽车流通行业4S门店生存性指标:零服吸收率
数据库·信息可视化·数据分析·汽车·商业智能bi
王柏龙4 小时前
Mongodb入门介绍
数据库·mongodb