数据库7种范式

在关系数据库设计中,存在多个范式,通常从第一范式(1NF)到更高阶的范式。以下是一些常见的数据库范式:

1. 第一范式(1NF)

确保每个表的每个列都包含原子值,不可再分。

  • 每个表都应该有一个主键:保证表中的每一行都是唯一标识的。
  • 表中的每一列都应该包含原子值:每个单元格中只能包含一个值,而不能包含多个值。

不满足第一范式的后果

  • 如果不符合第一范式,可能会导致数据冗余、更新异常和复杂的查询操作。

举例

违反第一范式的学生课程信息表:

学生ID学生姓名所修课程
1小明数学, 物理
2小红化学, 英语
3小刚生物, 历史, 地理

上述表违反了第一范式,因为 "所修课程" 这一列包含了多个值。正确的设计应该是将每门课程放在单独的行中:

学生ID学生姓名所修课程
1小明数学
1小明物理
2小红化学
2小红英语
3小刚生物
3小刚历史
3小刚地理

2. 第二范式(2NF)

确保表中的非主键列完全依赖于整个主键,而不是部分依赖。

也就是说2NF针对复合组件和部分依赖的情况。如果表中有一个复合组件(即有多个列组成的主键),那么所有其他非主键列都必须完全依赖于这个复合组件。

举例:

以下表格是一个具有复合主键(StudentID, CourseID)且存在冗余的表格。因为 CourseNameInstructor 不完全依赖于整个复合主键,而只依赖于部分主键。

StudentCourses
| StudentID | CourseID | CourseName | Instructor   |
|-----------|----------|------------|--------------|
| 1         | 101      | Math       | Prof. Smith  |
| 1         | 102      | English    | Prof. Johnson|
| 2         | 101      | Math       | Prof. Smith  |

冗余分析:

在原始表格中,Math和Prof. Smith的信息被重复存储了两次(两次在StudentID为1和2的行中出现),而这两门课实际上是相同的。这种冗余会导致以下问题:

1. 数据一致性:如果对MathProf. Smith的信息进行修改,需要在多个地方进行更新,容易出现数据不一致的情况。

2. 存储空间浪费: 存储相同的课程信息多次会浪费存储空间,尤其在大型数据库中可能成为一个问题。

3. 维护复杂性: 数据冗余增加了维护的复杂性,因为需要确保多个地方的数据保持一致。

通过拆分表格,我们可以消除这些冗余,如拆分后的Courses表格所示:

Students
| StudentID | StudentName |
|-----------|-------------|
| 1         | John        |
| 2         | Jane        |Courses
| CourseID | CourseName | Instructor   |
|----------|------------|--------------|
| 101      | Math       | Prof. Smith  |
| 102      | English    | Prof. Johnson|StudentCourses
| StudentID | CourseID |
|-----------|----------|
| 1         | 101      |
| 1         | 102      |
| 2         | 101      |

现在,每门课程只有一条记录,避免了在原表格中重复存储相同的课程信息。这有助于提高数据一致性、减少存储空间的浪费,并简化了维护过程。这就是通过第二范式的原则来消除冗余的方式。

3. 第三范式(3NF)

确保表中的每个非主键列不依赖于其他非主键列,即不存在传递依赖

  • 影响一致性: 3NF 要求表中的非主键列不能有传递依赖关系,进一步确保了数据的一致性。每个非主键列都直接依赖于主键,而不是依赖于其他非主键列。
  • 减少冗余: 3NF 通过消除非主键列之间的传递依赖,减少了数据冗余。

举例:

考虑一个包含学生信息、课程信息和学生成绩的表格:

在上述表格中,(StudentID, CourseID) 是复合主键。这个表格满足第二范式,因为非主键列(例如 InstructorDepartment)完全依赖于整个复合主键, 只有一个完整的(StudentID, CourseID)才能确定一个Instructor 或者Department  。然而,该表不满足第三范式,因为 Instructor 和Department列直接依赖于 CourseID,而 CourseID 又依赖于 StudentID。存在传递依赖关系,违反了第三范式的要求。

StudentCourses
| StudentID | CourseID | Instructor   | Department   |
|-----------|----------|--------------|--------------|
| 1         | 101      | Prof. Smith  | Computer Sci |
| 1         | 102      | Prof. Johnson| English      |
| 2         | 101      | Prof. Smith  | Computer Sci |

为了满足第三范式,我们可以将表格拆分,将 Instructor 列从 StudentCourses 表中分离:

1. Courses

Courses
| CourseID | Department   |
|----------|--------------|
| 101      | Computer Sci |
| 102      | English      |

2. StudentCourses

StudentCourses
| StudentID | CourseID |
|-----------|----------|
| 1         | 101      |
| 1         | 102      |
| 2         | 101      |

3. Instructors

Instructors
| CourseID | Instructor   |
|----------|--------------|
| 101      | Prof. Smith  |
| 102      | Prof. Johnson|

4. 巴斯-科德规范形式(BCNF)

也就是说对表格里的每一个候选键,当他们作为主键时,每个非主属性都要完全依赖于该候选键,才算满足BCNF范式。候选键是可以唯一标识一行数据的最小组合。

  • 主要关注消除关系中的部分依赖和传递依赖
  • 要求每个非主属性完全依赖于候选键,而不是只依赖于候选键的一部分。
  • 通过分解表来消除部分依赖和传递依赖的影响,确保每个非主属性都直接依赖于所有的候选键。

示例:

Orders
| OrderID | ProductID | ProductName | CustomerID | CustomerName | Price |
|---------|-----------|-------------|------------|--------------|-------|
| 1       | 101       | Laptop      | 1001       | John         | 1200  |
| 2       | 102       | Printer     | 1002       | Jane         | 300   |
| 3       | 101       | Laptop      | 1003       | Bob          | 1200  |

在上述表格中,(OrderID, ProductID) 是候选键。但是,CustomerName 仅依赖于 CustomerID,而不依赖于整个候选键。为了满足 BCNF,可以将表格拆分:

Orders
| OrderID | ProductID | CustomerID | Price |
|---------|-----------|------------|-------|
| 1       | 101       | 1001       | 1200  |
| 2       | 102       | 1002       | 300   |
| 3       | 101       | 1003       | 1200  |Customers
| CustomerID | CustomerName |
|------------|--------------|
| 1001       | John         |
| 1002       | Jane         |
| 1003       | Bob          |

5. 第四范式(4NF)

处理多值依赖,确保每个非主键属性完全依赖于候选键,而不是依赖于候选键的一部分。

  • 主要关注消除关系中的多值依赖
  • 多值依赖是指在关系中的非主属性之间存在的关系,其中一个非主属性的值可以决定另一个非主属性的值。
  • 通过分解表来消除多值依赖,确保表中的每个非主属性都不依赖于其他非主属性的非主属性。

示例:

考虑一个表格 Employees

Employees
| EmployeeID | Department   | Skills            |
|------------|--------------|-------------------|
| 1          | HR           | Communication, HR|
| 2          | IT           | Programming, IT   |
| 3          | Marketing    | Marketing, Sales  |

在上述表格中,Skills 列包含多个值,表示一个员工可能有多个技能。为了满足第四范式,可以将表格拆分:

Employees
| EmployeeID | Department |
|------------|------------|
| 1          | HR         |
| 2          | IT         |
| 3          | Marketing  |EmployeeSkills
| EmployeeID | Skill        |
|------------|--------------|
| 1          | Communication|
| 1          | HR           |
| 2          | Programming  |
| 2          | IT           |
| 3          | Marketing    |
| 3          | Sales        |

6. 第五范式(5NF)

处理联合依赖,确保每个非主键属性不依赖于候选键的某一部分。

示例:

考虑一个包含项目、部门和员工信息的表格:

Projects
| ProjectID | ProjectName | DepartmentID | DepartmentName | EmployeeID | EmployeeName |
|-----------|-------------|--------------|-----------------|------------|--------------|
| 1         | ProjectA    | 101          | HR              | 1001       | John         |
| 2         | ProjectB    | 102          | IT              | 1002       | Jane         |
| 3         | ProjectC    | 103          | Marketing       | 1003       | Bob          |

在上述表格中,(ProjectID, DepartmentID) 是联合主键。如果考虑 (ProjectID, DepartmentID) -> EmployeeID 的联合依赖关系,那么我们可以将表格拆分

Projects
| ProjectID | ProjectName | DepartmentID |
|-----------|-------------|--------------|
| 1         | ProjectA    | 101          |
| 2         | ProjectB    | 102          |
| 3         | ProjectC    | 103          |Departments
| DepartmentID | DepartmentName |
|--------------|-----------------|
| 101          | HR              |
| 102          | IT              |
| 103          | Marketing       |Employees
| EmployeeID | EmployeeName |
|------------|--------------|
| 1001       | John         |
| 1002       | Jane         |
| 1003       | Bob          |ProjectEmployees
| ProjectID | DepartmentID | EmployeeID |
|-----------|--------------|------------|
| 1         | 101          | 1001       |
| 2         | 102          | 1002       |
| 3         | 103          | 1003       |

这样,联合依赖关系被消除,每个表都只包含必要的信息。

7. 第六范式(6NF)

处理超关系(超关系是一个关系中的某些属性是另一个关系的关系键)。

是关系数据库理论中的一个较为高级和少用的范式。它主要涉及到多值依赖的概念,通常在包含多值依赖的情况下才会考虑使用。

示例:

考虑一个包含课程、学生和成绩的表格:

Grades
| CourseID | StudentID | Grade |
|----------|-----------|-------|
| 101      | 1001      | A     |
| 102      | 1002      | B     |
| 101      | 1003      | C     |

在上述表格中,(CourseID, StudentID) 是联合主键。如果考虑 CourseID -> Grade 的函数依赖关系,我们可以将表格拆分:

Courses
| CourseID | CourseName |
|----------|------------|
| 101      | Math       |
| 102      | English    |Students
| StudentID | StudentName |
|-----------|-------------|
| 1001      | John        |
| 1002      | Jane        |
| 1003      | Bob         |CourseGrades
| CourseID | Grade |
|----------|-------|
| 101      | A     |
| 102      | B     |
| 101      | C     |StudentCourseGrades
| StudentID | CourseID | Grade |
|-----------|----------|-------|
| 1001      | 101      | A     |
| 1002      | 102      | B     |
| 1003      | 101      | C     |

8. 第七范式(7NF)

第七范式通常涉及到更复杂的概念,主要用于处理多值依赖。在实际应用中,很少需要考虑到第七范式,因为这个范式要求的条件非常严格,而且可能导致过多的表和复杂的查询。

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

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

相关文章

MySQL:ERROR 1067 - Invalid default value for ‘end_time‘【解决办法】

问题描述(mysql版本:5.7.36): 今天在使用Navicat可视化工具运行sql文件,发生如下错误: 在图中,sql是没有错误的,但是运行报错Invalid default value for end_time。 解决办法&#…

Python的安装与卸载【Windows系统】

在 Windows 上安装与卸载 Python Python的安装 下载Python 安装Python 下载完后打开安装包 注意最底下的"Add Python 3.8 to Path"(将Python加入环境变量)一定要勾选!!!这样就可以免去之后环境配置的烦恼…

方差分解(variance decomposition)研究发展史

方差分解(variance decomposition)研究发展史 1 早期技术概述1.1 方差组分分析(variance components analysis, VCA )1.2 方差分析(Analysis of Variance,简称ANOVA)2 交叉嵌套数据结构和早期方差分解技术的局限性3 多层次建模方法的方差分解参考1 早期技术概述 方差分…

计算机网络——应用层(2)

计算机网络——应用层(2) 小程一言专栏链接: [link](http://t.csdnimg.cn/ZUTXU) Web和HTTP概念解读HTTPHTTP请求和响应包含内容常见的请求方法Web缓存优点缺点 总结 DNS提供的服务 小程一言 我的计算机网络专栏,是自己在计算机网络学习过程…

【手搓深度学习算法】用线性回归预测波士顿房价

线性回归 线性回归是一种监督学习方法,用于建立因变量与一个或多个自变量之间的关系。线性回归的目标是找到一条直线,使得所有数据点到这条直线的距离之和最小。 线性回归的基本形式如下: y β 0 β 1 x 1 β 2 x 2 . . . β n x n ϵ…

HTML 基本元素是什么?

"HTML 基本元素" 是指构成 HTML 网页的基本部分。HTML 是超文本标记语言的简称,是一种用于创建网页的标准标记语言。HTML 基本元素包括标题、段落、列表、链接、图片等,这些元素用于构建网页的结构和内容。通过使用 HTML 基本元素,…

Sui 2024 Space首秀精彩集锦

1月5日,Sui Network官方在X平台进行了名为《Looking Ahead: What’s in Store for 2024》的2024 Space首秀,Mysten Labs联合创始人兼首席产品官Adeniyi Abiodun和首席技术官Sam Blackshear,与全球Sui支持者一起探讨Sui网络的2024发展大计&…

Kubernetes 专栏目录

知识点 1. nodeselector 知识点 2. daemonset 通过 label 设置指定节点启动 pod 3. webhook 失败策略 资源 yaml 模板 1. pod yaml 字段含义 2. service yaml 字段含义 kubectl 1. kubectl 给资源添加/删除 label 2. kubectl 重启 deployment(滚动更新&#xf…

浆果行业调查:到2026年市场将达到515亿美元

浆果是一种流行的水果类别,包括各种水果,例如草莓、蓝莓、覆盆子、黑莓等。它们以其高营养价值、独特风味和烹饪应用的多功能性而闻名。近年来,由于人们越来越意识到食用浆果对健康有益,因此对浆果的需求一直在上升,预…

英飞凌TC3xx之一起认识GTM(十)详细说说GTM子模块TIM(架构)

英飞凌TC3xx之一起认识GTM(十)详细说说GTM子模块TIM(架构) 1 TIM简介1.1 输入源选择寄存器INPUTSRCx1.2 外部捕捉源选择寄存器 EXTCAPSRCx2 TIM通道2.1 TIM通道架构2.2 TIM通道模式3 总结编者话:GTM的定时器输入模块TIM是经常被使用的模块,因为它简单易用。它可以接入多种…

论文系列之-Mixtral of Experts

Q: 这篇论文试图解决什么问题? A: 这篇论文介绍了Mixtral 8x7B,这是一个稀疏混合专家(Sparse Mixture of Experts,SMoE)语言模型。它试图解决的主要问题包括: 1. 提高模型性能:通过使用稀疏混…

改进的yolov5目标检测-yolov5替换骨干网络-yolo剪枝(TensorRT及NCNN部署)

YOLOv5改进点 2022.10.30 复现TPH-YOLOv5 2022.10.31 完成替换backbone为Ghostnet 2022.11.02 完成替换backbone为Shufflenetv2 2022.11.05 完成替换backbone为Mobilenetv3Small 2022.11.10 完成EagleEye对YOLOv5系列剪枝支持 2022.11.14 完成MQBench对YOLOv5系列量化支持…

【开源】基于JAVA、微信小程序的音乐平台

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示 四、核心代码4.1 查询单首音乐4.2 新增音乐4.3 新增音乐订单4.4 查询音乐订单4.5 新增音乐收藏 五、免责说明 一、摘要 1.1 项目介绍 基于微信小程序JAVAVueSpringBootMySQL的音乐平台,包含了音乐…

Hive 日期处理函数汇总

Hive 日期处理函数汇总 最近项目处理日期操作比较繁杂,使用Hive的日期函数也较频繁 1. 加减日期 date_add(‘日期字符串’,int值) :把一个字符串日期格式加n天,n为int值 select date_add(‘2023-12-31’,7); 结果: 2024-01-07 date_sub(‘日期字符串’,int值) :把一个字符串…

IPV6学习记录

IPV6的意义 从广义上来看IPV6协议包含的内容很多: IPV6地址的生成与分配 IPV6的报头的功能内容 IPV4网络兼容IPV6的方案 ICMPv6的功能(融合了arp和IGMP功能) IPV6的路由方式 ipv6的诞生除了由于ipv4的地址枯竭外,很大程度上也是因为ipv4多年的发展产生了很多…

数字化工厂产品推荐 带OPC UA的分布式IO模块

背景 近年来,为了提升在全球范围内的竞争力,制造企业希望自己工厂的机器之间协同性更强,自动化设备采集到的数据能够发挥更大的价值,越来越多的传统型工业制造企业开始加入数字化工厂建设的行列,实现智能制造。 数字化…

探索Shadowsocks-Android:保护你的网络隐私

探索Shadowsocks-Android:保护你的网络隐私 I. 引言 在数字时代,网络隐私和安全变得愈发重要。我们越来越依赖互联网,但同时也面临着各种网络限制和监控。在这个背景下,Shadowsocks-Android应用程序应运而生,为用户提…

【定位恶意域名请求】

DNS服务器没有开启日志存储 在DNS服务器没有开启日志存储的情况下,要确定哪台机器请求恶意域名会比较困难。但是,你可以尝试以下几种方法: 网络嗅探工具:使用网络嗅探工具(如Wireshark)来捕获网络流量。通…

“高端”的位运算

王有志,一个分享硬核Java技术的互金摸鱼侠加入Java人的提桶跑路群:共同富裕的Java人 原计划迭代作为预备知识的收尾,不过在解2的幂和4的幂时,想到关于数字2的问题可以通过位运算去解决,因此补充了关于位运算的内容。 …

3D软件坐标系速查【左手/右手】

本文介绍不同3D软件的世界坐标系之间的差异及其工作原理。 NSDT工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎 基本上,游戏引擎和3…