数据库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的电子点餐系统小程序 一、前言 二、系统设计 三、系统功能设计 系统功能实现 前台: 后台: 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: …...
观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...
【笔记】WSL 中 Rust 安装与测试完整记录
#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统:Ubuntu 24.04 LTS (WSL2)架构:x86_64 (GNU/Linux)Rust 版本:rustc 1.87.0 (2025-05-09)Cargo 版本:cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...
【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论
路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中(图1): mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...
接口自动化测试:HttpRunner基础
相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型…...
认识CMake并使用CMake构建自己的第一个项目
1.CMake的作用和优势 跨平台支持:CMake支持多种操作系统和编译器,使用同一份构建配置可以在不同的环境中使用 简化配置:通过CMakeLists.txt文件,用户可以定义项目结构、依赖项、编译选项等,无需手动编写复杂的构建脚本…...
Vue 模板语句的数据来源
🧩 Vue 模板语句的数据来源:全方位解析 Vue 模板(<template> 部分)中的表达式、指令绑定(如 v-bind, v-on)和插值({{ }})都在一个特定的作用域内求值。这个作用域由当前 组件…...
vue3 daterange正则踩坑
<el-form-item label"空置时间" prop"vacantTime"> <el-date-picker v-model"form.vacantTime" type"daterange" start-placeholder"开始日期" end-placeholder"结束日期" clearable :editable"fal…...
