范式一二三

news/2025/3/13 11:07:16/文章来源:https://www.cnblogs.com/twfb/p/18769519

数据库的基本概念

  • 实体:
    在数据库中往往是一个数据表。
  • 属性:
    在关系数据库中,属性可以看作是“表的一列”。
  • 元组:
    表中的一行就是一个元组。
  • 分量:
    即元组的某个属性值。在一个关系数据库中,属性是一个操作原子,即关系数据库在做任何操作的时候,属性是“不可分的”。否则就不是关系数据库了。
  • 候选码和主码:
    表中可以唯一确定一个元组的某个属性(或者属性组)叫候选码,我们从许多个候选码中挑一个就叫主码。
  • 全码:
    如果一个码包含了所有的属性,这个码就是全码。
  • 主属性:
    一个属性只要在任何一个候选码中出现过,这个属性就是主属性。
  • 非主属性/非键属性/非码属性:
    与上面相反,没有在任何候选码中出现过,这个属性就是非主属性。
  • 外码:
    一个属性(或属性组),它不是码,但是它别的表的码,它就是外码。

函数依赖

函数依赖的定义
设R(U)是一个属性集U上的一个关系模式,X和Y是U的子集。若对于R(U)的任意两个可能的具体关系r1、r2,若r1[x]等于r2[x]则r1[y]等于r2[y],或者若r1[x] != r2[x]则r1[y] != r2[y],称X决定Y,或者Y函数依赖于X,记作X→Y。即像函数一样,给一个确定的输入(属性集X),有一个确定的输出(属性集Y)。
抽象的“关系模式”和具体存在的“关系”,下文统称“关系”。下面是几种函数依赖的定义:

  • 如果X→Y,但Y为X的子集, 则称X→Y是平凡函数依赖。
    举例:
    关系R(Sno, Cno),依赖关系(Sno, Cno)→Sno,(Sno, Cno)→Cno都是平凡函数依赖。
  • 如果X→Y,但Y不为X的子集,则称X→Y是非平凡的函数依赖。
    举例:
    关系R(Sno, Cno, Grade),依赖关系(Sno, Cno)→Grade是非平凡函数依赖。
  • 如果X→Y,存在X的真子集X1,使得X1→Y,则称Y部分依赖于X。也就是Y依赖于部分的X。
    举例:
    学生表(学号, 姓名, 性别, 班级, 年龄),(学号, 姓名)→性别,学号→性别,所以(学号, 姓名)→性别是部分函数依赖。
    如果X→Y,但任何X的真子集X1都不存在X1→Y则称Y完全依赖于X。
    举例:
    成绩表(学号, 课程号, 成绩),(学号, 课程号)→成绩,学号!→成绩,课程号!→成绩,所以(学号, 课程号)→成绩是完全函数依赖。
  • 如果X→Y,Y→Z,X⊄Y,Y!→X,(X∪Y)∩Z=∅,则称Z传递依赖于X。
    举例:
    关系S(学号, 系名, 系主任),学号→系名,系名→系主任,系名!→学号,所以学号→系主任为传递函数依赖。

函数依赖与属性的关系

设R(U)是属性集U上的关系模式,X、Y是U的子集。

如果X和Y之间是一对一(1:1)关系,如学校和校长,则存在函数依赖X→Y和Y→X。
如果X和Y之间是一对多(1:n)关系,如年龄和姓名,则存在函数依赖Y→X。
如果X和Y之间是多对多(m:n)关系,如学生和课程,则X和Y之间不存在函数依赖。

六种范式

第一范式(1NF)
非码的非平凡 | ↓ 消除非主属性对码的部分函数依赖
第二范式(2NF)
↓ 消除非主属性对码的传递函数依赖
第三范式(3NF)
↓ 消除主属性对码的部分和传递函数依赖
BC范式(BCNF)
↓ 消除非平凡且非函数依赖的多值依赖
第四范式(4NF)
↓消除不是由候选码所蕴含的连接依赖
第五范式(5NF)

第一范式(1NF)

定义: 每个单元格必须是单一值,无重复组或数组,确保数据原子性。
示例:
未规范化表格:

学生ID 学生姓名 课程和成绩
S1 Alice 数学:A, 科学:B
S2 Bob 历史:C, 数学:A
  • 主键: 无(未规范化,无明确主键)
  • 候选键:
  • 非键属性: 未规范化,无明确非键
  • 外键:
  • 列依赖关系:
    • 学生ID → 学生姓名
    • (学生ID, 课程) → 成绩(隐含,需拆分)

规范化后(1NF):

学生ID 学生姓名 课程 成绩
S1 Alice 数学 A
S1 Alice 科学 B
S2 Bob 历史 C
S2 Bob 数学 A
  • 主键: (学生ID, 课程)
  • 候选键: (学生ID, 课程)
  • 非键属性: 学生姓名, 成绩
  • 外键:
  • 列依赖关系:
    • 学生ID → 学生姓名
    • (学生ID, 课程) → 成绩

第二范式(2NF)

定义: 在1NF基础上,消除非主属性对主键的部分函数依赖。
示例:
修改前(1NF):

学生ID 学生姓名 课程 成绩
S1 Alice 数学 A
S1 Alice 科学 B
S2 Bob 历史 C
S2 Bob 数学 A
  • 主键: (学生ID, 课程)
  • 候选键: (学生ID, 课程)
  • 非键属性: 学生姓名, 成绩
  • 外键:
  • 列依赖关系:
    • 学生ID → 学生姓名
    • (学生ID, 课程) → 成绩

学生姓名只依赖学生ID,违反2NF。规范化后:

学生表:

学生ID 学生姓名
S1 Alice
S2 Bob
  • 主键: 学生ID
  • 候选键: 学生ID
  • 非键属性: 学生姓名
  • 外键:
  • 列依赖关系:
    • 学生ID → 学生姓名

注册表:

学生ID 课程 成绩
S1 数学 A
S1 科学 B
S2 历史 C
S2 数学 A
  • 主键: (学生ID, 课程)
  • 候选键: (学生ID, 课程)
  • 非键属性: 成绩
  • 外键: 学生ID 引用 学生表
  • 列依赖关系:
    • (学生ID, 课程) → 成绩

第三范式(3NF)

定义: 在2NF基础上,消除非主属性的传递函数依赖。
示例:
修改前(2NF):

课程代码 课程名称 部门名称 部门负责人
C1 数学 数学系 教授X
C2 科学 科学系 教授Y
C3 历史 历史系 教授Z
  • 主键: 课程代码
  • 候选键: 课程代码
  • 非键属性: 课程名称 , 部门名称 , 部门负责人
  • 外键:
  • 列依赖关系:
    • 课程代码 → 课程名称
    • 课程代码 → 部门名称
    • 部门名称 → 部门负责人

部门负责人通过部门名称间接依赖课程代码,违反3NF。规范化后:

部门表:

部门名称 部门负责人
数学系 教授X
科学系 教授Y
历史系 教授Z
  • 主键: 部门名称
  • 候选键: 部门名称
  • 非键属性: 部门负责人
  • 外键:
  • 列依赖关系:
    • 部门名称 → 部门负责人

课程表:

课程代码 课程名称 部门名称
C1 数学 数学系
C2 科学 科学系
C3 历史 历史系
  • 主键: 课程代码
  • 候选键: 课程代码
  • 非键属性: 课程名称, 部门名称
  • 外键: 部门名称 引用 部门表
  • 列依赖关系:
    • 课程代码 → 课程名称
    • 课程代码 → 部门名称

巴斯-科德范式(BCNF)

定义: 在3NF基础上,消除主属性对主键的部分函数依赖和传递函数依赖

示例:
修改前(3NF):

学员编号 课程代码 授课教室
S001 C101 R201
S002 C101 R201
S003 C102 R202
  • 主键: (学员编号, 课程代码)
  • 候选键: (学员编号, 课程代码)
  • 非键属性: 授课教室
  • 外键:
  • 列依赖关系:
    • (学员编号, 课程代码) → 授课教室
    • 课程代码 → 授课教室

授课教室依赖 课程代码(非主键),违反BCNF。规范化后:

课程表:

学员编号 课程代码
S001 C101
S002 C101
S003 C102

课程教室表:

课程代码 授课教室
C101 R201
C102 R202

第四范式(4NF)

定义: 在BCNF基础上,消除非平凡多值依赖,多值属性独立。
示例:

  • 不满足4NF:
    学生 课程 社团
    S1 数学 棋社
    S1 科学 网球
    S2 历史 棋社
  • 主键: 学生
  • 候选键: 学生
  • 非键属性: 课程, 社团
  • 外键:
  • 列依赖关系:
    • 学生→ 课程
    • 学生→ 社团
    • 多值依赖。
  • 满足4NF:
    • 学生-课程表:
      学生 课程
      S1 数学
      S1 科学
      S2 历史
    • 学生-社团表:
      学生 社团
      S1 棋社
      S1 网球
      S2 棋社
  • 解释:课程和社团独立,拆分表消除多值依赖。

第五范式(5NF)

定义: 在4NF基础上,消除非平凡连接依赖,确保无信息丢失。
示例:

  • 复杂场景,如供应商-零件-项目关系,需确保分解后可完整重建。
  • 示例较复杂,通常涉及三元关系,实际应用少见。

规范化路线

第一范式(1NF)
非码的非平凡 | ↓ 消除非主属性对码的部分函数依赖
第二范式(2NF)
↓ 消除非主属性对码的传递函数依赖
第三范式(3NF)
↓ 消除主属性对码的部分和传递函数依赖
BC范式(BCNF)
↓ 消除非平凡且非函数依赖的多值依赖
第四范式(4NF)
↓消除不是由候选码所蕴含的连接依赖
第五范式(5NF)

实践建议

研究表明,通常3NF即可,5NF较少使用。为效率可保留冗余,权衡性能与规范。


关键引用

  • 数据库六种范式详解(1NF/2NF/3NF/BCNF/4NF/5NF)
  • Database Normalization Detailed Guide
  • SQL Normalization Best Practices
  • Functional Dependencies and Normalization

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/898075.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

仓库物料编码太乱?一文教你用WMS系统做好物料编码!

在仓库管理中,物料编码是一件看似简单,实则影响深远的事。编码乱,仓库乱;编码清晰,仓库高效! 很多企业的仓库管理都面临这些问题:同样的物料多个编码,库存数据对不上,仓库找货像大海捞针。 编码规则混乱,采购、仓库、生产、财务对不上账,沟通全靠吼。 人工录入出错,…

关于maven通过system方式内置jar的问题

今天部署遇到一个问题,华为openGuass数据库的postgresql.jar必须要放在maven的插件配置里,否则打出来的jar包启动无论如何都会报错 如上图,这三个jar都是通过system内嵌的maven依赖,在maven-jar-plugin的manifestEntries的Class-Path标签里必须要严格配置上,否则启动就会报…

向导新建一个wxWidgets程序

在CodeBolcks+wxWidgets下的C++编程教程——用向导创建一个wxWidgets项目(xTetris) - lexyao - 博客园 在CodeBolcks+wxWidgets+wxSmith下的C++编程教程——用向导创建一个wxWidgets项目(sTetris) - lexyao - 博客园 在CodeBolcks+Windows API下的C++编程教程——用向导创建…

CH9121default与classical设置方法

SYN发送间隔调整方法:网口连接设备后双击设备列表中要配置的设备在扩展参数中单击获取扩展参数,在超时处理模式选项选择Classical然后执行设置扩展参数,最后点击复位模块后生效(仅TCP CLIENT模式有效)Default与Classical切换如果需要使用Classical模式需要在端口设置波特率后…

10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义

引言 ❝ 小编是一名10年+的.NET Coder,期间也写过Java、Python,从中深刻的认识到了软件开发与语言的无关性。现在小编已经脱离了一线开发岗位,在带领团队的过程中,发现了很多的问题,究其原因,更多的是开发思维的问题。所以小编通过总结自己过去十多年的软件开发经验,为年…

ChromeOS 134 版本更新

Chrome OS 134 版本更新ChromeOS 134 版本更新 一、ChromeOS 134 更新内容 1. ChromeOS 自助终端(Kiosk)模式支持隔离 Web 应用(Isolated Web Apps) 从 ChromeOS 134 开始,自助终端(Kiosk)模式支持 隔离 Web 应用(Isolated Web Apps,IWA),提供 更安全、更强大 的应用…

ChromeOS 133 版本更新

ChromeOS 133 版本更新 1. 增强托管用户的 Office 文件处理功能 从 ChromeOS 133 开始,托管用户 现在可以 无缝打开和编辑 Microsoft Office 文件(Word、PowerPoint、Excel),无论他们使用的是 Microsoft 365(Office for the web) 还是 Google Workspace。 1.1. 对不同用户…

搭建扫码挪车功能及源码分享

实现效果如图:首先要到这里去申请一个微信通知应用,有了这个应用才能接收到微信的通知: https://wxpusher.zjiecode.com/admin扫码注册后新建一个应用,你会获得一个appToken 再扫码就能获得你的UID(https://wxpusher.zjiecode.com/admin/main/wxuser/list 这个用户列表里面…

氛围灯系统(VALS)

随着汽车智能化、个性化、舒适性的需求逐年提高,汽车已不再只是简单的交通工具,而是一个能够为人们带来舒适与惬意的场所。高品质的汽车内饰照明在其中扮演了重要的角色,已成为汽车内饰领域中不可忽视的设计元素。氛围灯是一种应用在汽车内部,用于烘托车内环境氛围的内饰灯…

嘎嘎好用!推荐三款开源的 Redis 桌面客户端!

三款开源的 Redis 桌面客户端工具,开箱即用!大家好,我是 Java陈序员。 在日常开发中,经常会使用到 Redis, 为了更好的查看和操作 Redis 中的数据,通常会借助可视化操作客户端工具。 今天,给大家介绍三款开源的 Redis 桌面客户端工具,开箱即用!关注微信公众号:【Java陈…

​政务信创实施宝典:从项目治理到交付的7种必备工具链

政务信创实施是推动政府数字化转型、提升政务服务效能的重要举措。在实施过程中,从项目治理到交付需要运用一系列的工具链,以确保项目的顺利进行和目标的实现。本文将详细介绍七种必备的工具链,帮助政务信创项目实现高效、高质量的实施。 需求管理工具链 需求管理是政务信创…

84. 柱状图中最大的矩形(难)

目录题目单调题解:递增栈 题目给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。求在该柱状图中,能够勾勒出来的矩形的最大面积。单调题解:递增栈左边补0:让heights 数组的索引 0 入栈;右边补0:栈中的 bar 都比它高,能一一出栈。con…