数据库4个范式的说明
在数据库设计中,范式(Normal Form)用于消除冗余和异常,确保数据一致性。以下是第一范式、第二范式、第三范式和BCNF(Boyce-Codd Normal Form,即第四范式)的示例说明:
1. 第一范式(1NF)—— 消除重复数据
要求:所有字段都是原子性值,即每个字段中只能包含单一值,不能包含重复或多重数据。
不符合1NF的示例:
学生表
+-----------+---------+-------------------+
| 学生编号 | 姓名 | 课程 |
+-----------+---------+-------------------+
| 001 | 张三 | 数学, 语文 |
| 002 | 李四 | 英语 |
| 003 | 王五 | 化学, 物理 |
+-----------+---------+-------------------+
- 这里的
课程列包含了多个值(数学和语文在同一个单元格中),这不符合1NF。
符合1NF的示例:
学生表
+-----------+---------+---------+
| 学生编号 | 姓名 | 课程 |
+-----------+---------+---------+
| 001 | 张三 | 数学 |
| 001 | 张三 | 语文 |
| 002 | 李四 | 英语 |
| 003 | 王五 | 化学 |
| 003 | 王五 | 物理 |
+-----------+---------+---------+
- 这里每个字段的值都是原子性的。
2. 第二范式(2NF)—— 消除部分依赖
要求:在符合1NF的基础上,表中的所有非主属性必须完全依赖于主键(不能有部分依赖)。
不符合2NF的示例:
选课表
+-----------+---------+---------+---------+
| 学生编号 | 课程 | 成绩 | 学生电话 |
+-----------+---------+---------+---------+
| 001 | 数学 | 90 | 123456 |
| 001 | 语文 | 85 | 123456 |
| 002 | 英语 | 88 | 987654 |
+-----------+---------+---------+---------+
- 这里主键是
学生编号 + 课程的组合,但学生电话只依赖于学生编号,而与课程无关,这就是部分依赖。
符合2NF的示例:
将数据分解成两个表:
- 学生表(学生编号, 姓名, 学生电话)
+-----------+---------+---------+
| 学生编号 | 姓名 | 学生电话 |
+-----------+---------+---------+
| 001 | 张三 | 123456 |
| 002 | 李四 | 987654 |
+-----------+---------+---------+
- 成绩表(学生编号, 课程, 成绩)
+-----------+---------+---------+
| 学生编号 | 课程 | 成绩 |
+-----------+---------+---------+
| 001 | 数学 | 90 |
| 001 | 语文 | 85 |
| 002 | 英语 | 88 |
+-----------+---------+---------+
- 现在每个非主属性(如学生电话)都完全依赖于主键。
3. 第三范式(3NF)—— 消除传递依赖
要求:在符合2NF的基础上,所有非主属性必须直接依赖于主键,而不能通过其他非主属性间接依赖主键。
不符合3NF的示例:
学生表
+-----------+---------+-------------+---------+
| 学生编号 | 姓名 | 班级 | 班主任 |
+-----------+---------+-------------+---------+
| 001 | 张三 | 101 | 王老师 |
| 002 | 李四 | 102 | 李老师 |
+-----------+---------+-------------+---------+
- 这里
班主任是通过班级依赖于学生编号,而不是直接依赖主键(学生编号),这是传递依赖。
符合3NF的示例:
将数据分解成两个表:
- 学生表(学生编号, 姓名, 班级)
+-----------+---------+-------------+
| 学生编号 | 姓名 | 班级 |
+-----------+---------+-------------+
| 001 | 张三 | 101 |
| 002 | 李四 | 102 |
+-----------+---------+-------------+
- 班级表(班级, 班主任)
+-------------+---------+
| 班级 | 班主任 |
+-------------+---------+
| 101 | 王老师 |
| 102 | 李老师 |
+-------------+---------+
- 现在,班主任直接依赖于班级,不再有传递依赖。
4. BCNF(Boyce-Codd范式,第四范式)—— 处理多值依赖和候选键
要求:在符合3NF的基础上,每个非主属性必须依赖于候选键的超集,即任何候选键都能唯一确定表中的所有属性。
不符合BCNF的示例:
教师课程表
+-----------+---------+---------+
| 教师编号 | 课程 | 教室 |
+-----------+---------+---------+
| T001 | 数学 | A101 |
| T001 | 语文 | A102 |
| T002 | 英语 | A101 |
+-----------+---------+---------+
- 在这个表中,主键是
教师编号 + 课程,但是教室可以由课程唯一确定(每门课程都在同一个教室上课),这破坏了 BCNF 规范。
符合BCNF的示例:
分解成两个表:
- 教师课程表(教师编号, 课程)
+-----------+---------+
| 教师编号 | 课程 |
+-----------+---------+
| T001 | 数学 |
| T001 | 语文 |
| T002 | 英语 |
+-----------+---------+
- 课程教室表(课程, 教室)
+---------+---------+
| 课程 | 教室 |
+---------+---------+
| 数学 | A101 |
| 语文 | A102 |
| 英语 | A101 |
+---------+---------+
- 现在每个非主属性都依赖于候选键,没有多值依赖或不合理的键依赖。
总结
- 1NF:确保每个字段都是原子性值。
- 2NF:消除部分依赖,所有非主属性都完全依赖于主键。
- 3NF:消除传递依赖,所有非主属性直接依赖于主键。
- BCNF:确保每个非主属性依赖于候选键的超集,解决候选键的多值依赖问题。
相关文章:
数据库4个范式的说明
在数据库设计中,范式(Normal Form)用于消除冗余和异常,确保数据一致性。以下是第一范式、第二范式、第三范式和BCNF(Boyce-Codd Normal Form,即第四范式)的示例说明: 1. 第一范式&a…...
Excel怎么截图?快速捕捉工作表的多种方法
大家好,这里是效率办公指南! 📸 在日常工作中,我们经常需要对Excel工作表进行截图,无论是为了记录数据、制作演示还是进行数据对比。今天,我们就来学习几种在Excel中截图的方法以及它们的快捷键。 一、使…...
MyBatis动态SQL标签总结、开发手册、高阶用法(动态SQL、OGNL、批量操作、片段重用、 SQL 组合、 执行优化、嵌套查询与延迟加载)
MyBatis提供了一个非常强大的动态SQL功能,它使用了一组XML标签来帮助我们根据不同条件生成动态SQL。动态SQL的设计让开发者可以根据业务需求,灵活地构建SQL查询语句。以下是MyBatis动态SQL标签的总结。 动态SQL标签说明特点<if>条件判断语句&…...
出处不详 取数游戏
目录 取数游戏题目描述背景输入输出数据范围 题解解法优化 打赏 取数游戏 题目描述 背景 两人将 n n n个正整数围成一个圆环,规则如下: 第一名玩家随意选取数字;第二名玩家从与第一名玩家相邻的两个数字中选择一个;而后依次在…...
拉取ros2_control_demos存储库
目录 克隆存储库 方法 1: 使用 git clone 和 rosdep 安装依赖 方法 2: 使用 vcs 工具管理多个存储库 区别总结 rosdep 和 APT 的关系 网络问题 安装依赖 克隆存储库 方法 1: 使用 git clone 和 rosdep 安装依赖 下载存储库: mkdir -p ~/ros2_ws/src cd ~/ros…...
Apache Doris Flink Connector 24.0.0 版本正式发布
亲爱的社区伙伴们,Apache Doris Flink Connector 24.0.0 版本已于 2024 年 9 月 5 日正式发布。该版本新增了对 Flink 1.20 的支持,并支持通过 Arrow Flight SQL 高速读取 Doris 中数据。此外,整库同步所依赖的 FlinkCDC,也需升级…...
语音控制小夜灯的实现方案介绍
语音控制小夜灯的实现方案组成部分 语音控制小夜灯的实现方案主要包括硬件组装和软件编程两个部分。 硬件组装涉及将语音声控模块、灯泡、USB连接线等组件正确连接。首先,使用螺丝刀和螺丝将四个隔离柱固定在底板四个拐角处,同时将语音声控模…...
万龙觉醒免费辅助:VMOS云手机辅助巴克尔阵容搭配攻略!
《万龙觉醒》是一款策略类手游,选择合适的英雄阵容搭配能够极大提升战斗效果。而借助VMOS云手机的辅助功能,玩家可以更加轻松地管理游戏进程,优化操作体验。以下是VMOS云手机的三大核心功能,帮助你更好地掌控《万龙觉醒》战局。 V…...
【English】长难句翻译
这里写目录标题 技巧知识点1. 定语从句 和 状从区别2. 定从 修饰词3. who 和 whom 区别4. 除了定从、状从,还有啥?5. 怎么在长难句快速定位到主谓宾而不被各种从句中的动词影响判断6. 没有,的那种一大堆从句连起来的长难句怎么办7. 时态怎么放在翻译里总结技巧 知识点 1. 定语…...
npm login 或者 npm publish 超时timeout
场景:空闲时间想自己尝试下npm发布包,毕竟这东西可以不用,但不能不会 步骤很简单 1.npm login 2.npm publish 这里有个坑。。。因为想发布到npm上,所以这里的镜像源要换回https://registry.npmjs.org,不能使用淘宝镜像…...
Python的openpyxl使用記錄(包含合併單元格,圖片下載和圖片插入,設置邊框,設置背景顏色)
背景 因為公司最近要求我做一份自動化導出報告,內容有點多,為了省事,我選用了python,後面估計要自建在線辦公系統,這個後續再講 需要的庫 openpyxl 和Pandas 開始 Execl導入 from openpyxl import load_workbook …...
基于springboot+vue实现的在线商城系统
系统主要功能: (1)商品管理模块:实现了商品的基本信息录入、图片上传、状态管理等相关功能。 (2)商品分类模块:实现了分类的增删改查、分类层级管理、商品分类的关联等功能。 (3&…...
fastjson漏洞--以运维角度进行修复
文章目录 前言一、漏洞详情二、修复过程1.通过脚本方式修复1.1.脚本修复原理1.2.脚本演示1.3.执行脚本 2. 手动升级包2.1.修复步骤2.2.遇到的问题 前言 该漏洞是三个月前由安全团队扫描出来的,主要影响是: FastJSON是阿里巴巴的开源JSON解析库,它可以解…...
82页精品PPT | 构建数字化工厂的智能制造-数字化智能制造
新模式、新技术 、新制造的挑战 中国制造业正处于转型升级的关键时期,面临着多方面的挑战。创新能力不足导致产品同质化严重,缺乏核心竞争力;质量管理水平参差不齐,影响着产品的可靠性和安全性;品牌价值不高ÿ…...
Python的10个日期和时间操作的实用技巧
在Python中,处理日期和时间是一项常见且重要的任务。datetime模块提供了丰富的功能来执行这些操作。以下是10个日期和时间操作的实用技巧及其代码演示: 1. 获取当前日期和时间 from datetime import datetimenow datetime.now() print(f"当前日期…...
关于大模型在产品开发中所面临的问题,利用大模型技术解决很简单!
“ 具体问题具体分析,大模型技术没有统一的解决方案 ” 有人说2024年是大模型应用的元年,而大模型在未来的发展潜力毋庸置疑,这也就意味着人工智能技术是下一个风口,因此各种各样基于大模型技术的创业公司如雨后春笋般涌现。 从…...
SpringBoot2:请求处理原理分析-利用内容协商功能实现接口的两种数据格式(JSON、XML)
文章目录 一、功能说明二、案例实现1、基于请求头实现2、基于请求参数实现 一、功能说明 我们知道,用ResponseBody注解标注的接口,默认返回给页面的是json数据。 其实,也可以返回xml结构的数据给页面。 这一篇就来实现一下这个小功能。 二、…...
BUUCTF 之Basic 1(BUU LFI COURSE 1)
1、启动靶场,会生成一个URL地址,打开给的URL地址,会看到一个如下界面 可以看到是一个PHP文件,非常的简单,就几行代码,判断一下是否有一个GET的参数,并且是file名字,如果是并且加载&a…...
Android 蓝牙三方和动态权限三方
记录一下最近用到的简单的框架 蓝牙 FastBle:Android BLE通信库的介绍与高级用法 - 简书 https://github.com/Jasonchenlijian/FastBle 动态权限: GitHub - googlesamples/easypermissions: Simplify Android M system permissions 位置权限举例,arrayOf中多个…...
点餐|基于java的电子点餐系统小程序(源码+数据库+文档)
电子点餐系统|小程序|在线点餐 目录 基于java的电子点餐系统小程序 一、前言 二、系统设计 三、系统功能设计 系统功能实现 前台: 后台: 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: …...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
