当前位置: 首页 > backend >正文

​​6 .数据库规范化与关系理论复习大纲​

​数据库规范化与关系理论复习大纲​


​一、范式(Normal Forms)​

  1. 第一范式(1NF)
    • 核心要求:所有属性值不可再分(原子性)。

    • 示例:若“联系方式”包含电话和地址,需拆分为独立列。

  2. 第二范式(2NF)
    • 前提:满足1NF。

    • 核心要求:所有非主属性完全函数依赖于候选码消除部分依赖

    • 示例:候选码为{学号, 课程},若“成绩”仅依赖两者,但“姓名”仅依赖学号,需拆分。

  3. 第三范式(3NF)
    • 前提:满足2NF。

    • 核心要求:所有非主属性不传递依赖于候选码。(非主属性对候选码的传递依赖)

    • 示例:学号→学院→院长,需拆分为学生表和学院表。

  4. BCNF(Boyce-Codd范式)
    • 前提:满足3NF。

    • 核心要求:所有非平凡函数依赖的决定因素(X→Y的X)必须是候选码。     消除​主属性对候选码的依赖

    • 示例:若课程→教师,但课程非候选码,需拆分为课程表。

  5. 第四范式(4NF)
    • 前提:满足BCNF。

    • 核心要求:消除非平凡多值依赖(X→→Y的决定方X必须包含候选码)。

    • 示例:导师→→学生(多学生),需拆分为导师-学生表和导师-课程表。


​二、关键概念​

  1. 候选码(Candidate Key)
    • 定义:能唯一标识元组的最小属性组。

    • 特性:唯一性、最小性。

    • 示例:学号、身份证号均可作为学生表的候选码。

  2. 主属性(Prime Attribute)
    • 定义:属于至少一个候选码的属性。

    • 非主属性:不属于任何候选码的属性。

  3. 函数依赖类型
    • 平凡依赖:Y⊆X(如{学号,姓名}→学号)。

    • 完全依赖:Y完全依赖X,X的任意真子集不能决定Y。

    • 部分依赖:Y可由X的真子集决定(违反2NF)。

    • 传递依赖:X→Y→Z(违反3NF)。

    • 多值依赖:X→→Y(X决定Y的一组值,与R-X-Y无关,违反4NF)。

  4. 闭包(F⁺)
    • 定义:从F出发,通过Armstrong公理推出的所有依赖集合。

    • 唯一性:闭包唯一确定,与推导路径无关。

  5. 最小依赖集(最小覆盖)
    • 定义:无冗余依赖、左部简化、右部单属性的等价依赖集。

    • 特性:可能不唯一,但闭包相同。


​三、分解原则​

  1. 无损连接性
    • 判定:分解后的子表通过自然连接可完全恢复原表。

    • 方法:公共属性是某一子表的候选码(如R₁∩R₂→R₁或R₂)。

  2. 保持函数依赖
    • 判定:原依赖集F的闭包F⁺能被分解后的子表依赖集推出。

    • 示例:若原依赖A→B,需确保A和B在同一个子表中。


​四、Armstrong公理系统​

  1. 基本公理
    • 自反律:若Y⊆X,则X→Y。

    • 增广律:若X→Y,则XZ→YZ。

    • 传递律:若X→Y且Y→Z,则X→Z。

  2. 导出规则
    • 合并规则:X→Y且X→Z ⇒ X→YZ。

    • 分解规则:X→YZ ⇒ X→Y且X→Z。


​五、易混淆点对比​

概念区别点
3NF vs BCNFBCNF要求所有非平凡依赖的决定方是候选码,而3NF允许主属性传递依赖。
函数依赖 vs 多值依赖函数依赖是X→Y(一对一),多值依赖是X→→Y(一对多,且与R-X-Y无关)。
候选码 vs 主属性候选码是唯一标识元组的属性组,主属性是候选码中的任一属性。
闭包 vs 最小依赖集闭包唯一,最小依赖集可能有多个,但闭包相同。

​六、示例与应用​
• 示例1(BCNF分解)

• 原表:选课(学号, 课程, 教师)

• 问题:课程→教师(课程非候选码)→ 违反BCNF。

• 分解:选课表(学号, 课程) + 课程表(课程, 教师)。

• 示例2(无损分解验证)

• 分解R(A,B,C)为R₁(A,B)和R₂(B,C),若B是R₁或R₂的候选码,则无损。


总结:数据库规范化通过分解表结构消除冗余和异常,核心是理解各范式的约束条件及依赖关系。掌握闭包计算、候选码判定、无损分解方法,结合实例分析,可高效设计高范式数据库。

http://www.xdnf.cn/news/4219.html

相关文章:

  • 64.微服务保姆教程 (七) RocketMQ--分布式消息中间件
  • 常见汇编代码及其指定
  • MySQL 8.0 深度优化:从索引革命到事务增强
  • C语言结构体内存对齐使用场景
  • 飞牛云如何开启及使用ssh:小白用户上手指南-家庭云计算专家
  • Laravel 12 基于 EMQX 实现 MQTT 消息发送与接收
  • 电商数据接口开发进阶:京东 API 实时商品信息采集技术解析​
  • 通过 ModernBERT 实现零样本分类的性能提升
  • Nginx 安全防护与HTTPS部署
  • Super VLAN配置
  • Ubuntu 系统中解决 Firefox 中文显示乱码的完整指南
  • 荣耀A8互动娱乐组件部署实录(第3部分:控制端结构与房间通信协议)
  • 机器学习例题——预测facebook签到位置(K近邻算法)和葡萄酒质量预测(线性回归)
  • 数字传播生态中开源链动模式与智能技术协同驱动的品牌认知重构研究——基于“开源链动2+1模式+AI智能名片+S2B2C商城小程序”的场景化传播实践
  • IdeaVim配置指南
  • 【Linux】Linux中的调度和切换
  • 开源智能体MetaGPT记忆模块解读
  • 【大数据】服务器上部署Apache Paimon
  • 基于k8s的Jenkins CI/CD平台部署实践(三):集成ArgoCD实现持续部署
  • 高铁座位指示灯系统技术深度解析:从物联网到智慧出行的实践路径
  • idea使用lombok错误,找不到符号,明明编译没问题,运行报错
  • The 2023 ICPC Asia Taoyuan Regional Programming Contest
  • 13.Spring boot中使用Actuator 监控
  • 深入了解linux系统—— 进程地址空间
  • CVE-2025-24813:Apache Tomcat RCE 漏洞分析
  • 拟南芥T2T基因组-文献精读127
  • Github上如何准确地搜索开源项目
  • 高等数学第四章---不定积分(4.4有理函数的不定积分2)
  • Elasticsearch:我们如何在全球范围内实现支付基础设施的现代化?
  • 甲骨文云服务器技术全景解析:从基础架构到行业赋能​