详解数据库范式

范式

  • 1. 第一范式(1NF)
  • 2. 第二范式(2NF)
  • 3. 第三范式(3NF)
  • 4. BC范式(BCNF,Boyce-Codd Normal Form)
  • 5. 第四范式(4NF)
  • 6. 第五范式(5NF)
  • 总结:

在数据库设计中, 范式(Normal Forms, NFs)是一种用于规范化数据库结构的理论,用以消除数据冗余、提高数据一致性,同时减少异常问题。范式的核心思想是将数据划分成更小、更独立的表,并通过关系(外键)进行连接。

1. 第一范式(1NF)

目标:确保每列的值是原子值。

  • 要求:

    • 数据库表中的每一列只包含单一值(原子性)。
    • 不允许一列存储多个值(如数组、列表等),也不允许嵌套表。
  • 示例:不符合1NF

    学生ID姓名联系方式
    1张三12345, 67890
    2李四98765

    上述表中“联系方式”列包含了多个值,因此不符合1NF。

  • 改进(符合1NF)

    学生ID姓名联系方式
    1张三12345
    1张三67890
    2李四98765

2. 第二范式(2NF)

目标:消除非主属性对主键的部分依赖。

  • 要求:

    • 满足1NF。
    • 表中的每一个非主属性必须完全依赖于主键,而不能只依赖于主键的一部分(解决部分依赖)。
  • 示例:不符合2NF

    学生ID课程ID课程名称成绩
    1C001数学90
    1C002英语85

    假设主键是(学生ID, 课程ID)的组合,“课程名称”只依赖于课程ID,而不是组合主键,因此违反2NF。

  • 改进(分表,符合2NF)

    • 课程表:

      课程ID课程名称
      C001数学
      C002英语
    • 成绩表:

      学生ID课程ID成绩
      1C00190
      1C00285

3. 第三范式(3NF)

目标:消除非主属性之间的传递依赖。

  • 要求:

    • 满足2NF。
    • 非主属性之间不存在传递依赖(即非主属性不能依赖于另一个非主属性)。
  • 示例:不符合3NF

    学生ID系ID系名称
    1CS001计算机系
    2EE002电气工程系

    在此表中,“系名称”依赖于“系ID”,“系ID”又依赖于主键“学生ID”,这是一种传递依赖。

  • 改进(分表,符合3NF)

    • 学生表:

      学生ID系ID
      1CS001
      2EE002
    • 系表:

      系ID系名称
      CS001计算机系
      EE002电气工程系

4. BC范式(BCNF,Boyce-Codd Normal Form)

目标:消除主属性间的依赖关系。

  • 要求:

    • 满足3NF。
    • 对于每一个函数依赖 X → Y X \to Y XY X X X 必须是超键。(超键是一个或多个属性的组合,这些属性的值可以唯一地标识表中的每一行记录。换句话说,一个超键中的值是足够独特的,它能够用来区分表中的任意两条记录。)
  • 示例:不符合BCNF

    教师ID课程名称教室
    T001数学R101
    T002英语R102

    假设(教师ID, 课程名称)为主键,“教室”依赖于“课程名称”,“课程名称”不是超键,因此违反BCNF。

  • 改进(分表)

    • 课程表:

      课程名称教室
      数学R101
      英语R102
    • 教师课程表:

      教师ID课程名称
      T001数学
      T002英语

5. 第四范式(4NF)

目标:消除多值依赖。

  • 要求:

    • 满足BCNF。
    • 表中不能存在非主属性的多值依赖。
  • 示例:不符合4NF

    学生ID语言爱好
    1英语篮球
    1英语足球
    1法语篮球
    1法语足球

    上述表中,“语言”和“爱好”是独立的多值属性,存在多值依赖。

  • 改进(分表)

    • 学生语言表:

      学生ID语言
      1英语
      1法语
    • 学生爱好表:

      学生ID爱好
      1篮球
      1足球

6. 第五范式(5NF)

目标:消除连接依赖。

  • 要求:
    • 满足4NF。
    • 表中每一个关系都应该能够通过其更小的关系表连接复原(避免连接依赖)。

总结:

范式目标主要特点
1NF消除重复组,保证每列值原子性。每列只存储单一值。
2NF消除部分依赖,非主属性完全依赖主键。必须完全依赖主键,不允许部分依赖。
3NF消除传递依赖,非主属性只依赖主键。非主属性之间不能存在依赖关系。
BCNF消除主属性间依赖,所有函数依赖的决定因素为超键。更严格的3NF。
4NF消除多值依赖,每个关系只存储一个独立主题。解决多值属性独立的问题。
5NF消除连接依赖,确保关系可以通过小表复原。对复杂表分解到极致。

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

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

相关文章

一窥DeepSeek开源EPLB项目:揭开技术背后的面纱

摘要 在DeepSeek开源DualPipe项目的同一天,EPLB项目也正式对外公开。EPLB(Enhanced Pipeline Balancing)并非一蹴而就的奇迹,而是经过长时间的研发与优化。该项目旨在通过改进管道平衡机制,提升系统的稳定性和效率。本…

Unity进阶课程【二】Mask 组件的使用 UI遮罩效果以及透明抠图效果

Unity组件讲解 Mask 时隔多年,今天咱们继续进阶课程,这几年变化很大,但是一直还是从事Unity行业,行业虽难,依旧坚持,以后会养成习惯,定期更新,希望小伙伴们监督,有想学习…

汽车无钥匙启动系统不使用传统机械钥匙启动汽车

汽车无钥匙启动系统 定义 汽车无钥匙启动系统(Keyless Start System),启动车辆时不用掏拧钥匙,只需把钥匙放在包内或口袋里,按下车内按键或拧动导板即可使发动机点火。它无需插入钥匙,通过点按按键或旋转…

Webpack 和 Vite 的主要区别

Webpack 和 Vite 的主要区别,从构建机制、开发体验、生产优化等多个维度进行对比: 1. 构建机制与速度 Webpack 全量打包:启动时必须分析所有模块依赖关系,进行全量打包,生成 Bundle 文件。项目越大,冷启动时…

【Python】Python 3.11安装教程

一、Python 3.11安装包下载 1. Python 3.11下载与安装 Download Python | Python.org 下载完成包含以下文件: 二、python3.11安装步骤 1.右键以管理员身份运行安装程序。 2.勾选【Add Python…】然后点击【Customize…】。 3.页面点击【Next】。 4.勾选【Install …

如何处理PHP中的编码问题

如何处理PHP中的编码问题 在PHP开发过程中,编码问题是一个常见且棘手的问题。无论是处理用户输入、数据库交互,还是与外部API通信,编码问题都可能导致数据乱码、解析错误甚至安全漏洞。本文将深入探讨PHP中的编码问题,并提供一些…

【毕业论文格式】word分页符后的标题段前间距消失

文章目录 【问题描述】 分页符之后的段落开头,明明设置了标题有段前段后间距,但是没有显示间距: 【解决办法】 选中标题,选择边框 3. 选择段前间距,1~31磅的一个数 结果

【实战ES】实战 Elasticsearch:快速上手与深度实践-附录-3-从ES 7.x到8.x的平滑迁移策略

👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 附录-版本升级指南 3-Elasticsearch 7.x 到 8.x 平滑迁移策略指南1. 升级必要性分析1.1 版本特性对比1.2 兼容性评估矩阵 2. 预升级准备清单2.1 环境检查表2.2 数据备份策略 3. 分阶段…

Android,Java,Kotlin 确保线程顺序执行的多种实现方式

在多线程编程中,有时需要确保一个线程必须等待另一个线程执行完毕后再执行。本文将介绍几种常见的方法来实现这一需求,并提供详细的代码示例。 1. 使用 Thread.join() Thread.join() 是最简单直接的方法,它会让当前线程等待目标线程执行完毕…

论文调研 | 一些开源的AI代码生成模型调研及总结【更新于250313】

本文主要介绍主流代码生成模型,总结了基于代码生成的大语言模型,按照时间顺序排列。 在了解代码大语言模型之前,需要了解代码相关子任务 代码生成 文本生成代码(Text to code):根据自然语言描述生成代码 重构代码(Refactoring …

【QT】-一文说清楚QT定时器怎么用

在 Qt 中,定时器(QTimer)是用来定时执行某些任务的非常有用的类。它可以帮助你在指定的时间间隔后重复执行某个函数。常见的用法是启动一个定时器,每过一段时间自动执行某个操作,比如更新 UI、检查状态或发送数据等。 …

iOS OC匹配多个文字修改颜色和字号

1、传入字符串数组&#xff0c;通过NSMutableAttributedString修改匹配文字 可以根据需要搞成匹配单个字符串 - (NSAttributedString *)applyFontSizeToText:(NSString *)text matchStrings:(NSArray<NSString *> *)matchStrings {NSMutableAttributedString *attribut…

3DS模拟器使用(pc+安卓)+金手指+存档互传

1、引言 3ds模拟器已经能够在手机端近乎完美模拟了&#xff0c;那么多的3ds游戏&#xff0c;比玩手机游戏舒服多了。 本人是精灵宝可梦的老玩家&#xff0c;从第一世代就一直在玩&#xff0c;刚耍完NDS的第五世代&#xff0c;黑白系列。现在到宝可梦XY了&#xff0c;需要在3d…

Java EE Web环境安装

Java EE Web环境安装 一、JDK安装与测试&#xff08;Windows环境&#xff09; 1. 安装JDK 官网下载&#xff1a;Oracle JDK&#xff08;选择Windows x64 Installer&#xff09;双击安装包&#xff0c;按向导完成安装 ​ 2. 环境变量配置 右键【此电脑】→【属性】→【高级…

探索CSS魔法:3D翻转与渐变光效的结合

随着前端技术的不断发展&#xff0c;CSS不再仅仅局限于样式设计&#xff0c;它也成为了实现富有互动性的动画和特效的强大工具。本篇文章将向大家展示如何利用CSS的3D变换和渐变光效&#xff0c;打造一张“神秘卡片”&#xff0c;通过简单的代码实现炫酷的视觉效果。 1. 初识神…

C++ STL 深度解析:vector 的全面指南与进阶技巧

一、底层架构深度剖析 1.1 内存管理机制 vector 通过三个指针实现动态内存管理&#xff1a; _start&#xff1a;指向分配内存的首元素&#xff08;begin()返回值&#xff09;_finish&#xff1a;指向最后一个元素的下一个位置&#xff08;end()返回值&#xff09;_end_of_st…

pom.xml中配置的repository,在编译器下载依赖包没生效,怎么解决

针对 pom.xml 中配置的仓库&#xff08;repository&#xff09;未生效导致依赖下载失败的问题&#xff0c;结合搜索结果和 Maven 依赖解析机制&#xff0c;以下是分步解决方案&#xff1a; 一、问题原因分析 镜像覆盖全局请求 若 settings.xml 中配置了镜像&#xff08;mirror…

S7-1200 G2移植旧版本S7-1200程序的具体方法示例

S7-1200 G2移植旧版本S7-1200程序的具体方法示例 前期概要: S7-1200 G2必须基于TIA博途V20,之前的程序可通过移植的方式在新硬件上使用。 该移植工具可自动将TIA Portal 项目从 S7-1200 移植到更新的S7-1200 G2。 注意: 该插件支持在同一TIA Portal项目实例内将软件和/或硬…

CNN SSP, ASPP, PPM 分割任务经典尺度聚合模块

SSP&#xff1a;Spatial Pyramid Pooling 让任意大小图像最终输出的特征维度始终固定&#xff0c;便于接全链接层。 4x4, 2x2,1x1区域的maxpooling&#xff0c;让任意大小图像最终输出最终特征维度始终为 &#xff08;1641)*256 ASSP:Atrous Spatial Pyramid Pooling 不进行…

OpenHarmony-XTS测试

OpenHarmony-XTS测试 OpenHarmony-XTS测试环境搭建测试准备开始运行PS OpenHarmony-XTS测试 针对OpenHarmony版本进行XTS测试使用记录。 windows环境。 以acts套件为例。 环境搭建 获取测试套件&#xff0c;两种方法 1&#xff09;官网下载&#xff1a;https://www.openharm…