数据库系统——规范化1NF~BCNF
数据库规范化完全指南:从零到BCNF,中学生也能秒懂!📚✨
一、什么是数据库规范化?
科学定义 🔍
数据库规范化是通过一系列规则(范式)将数据库表结构分解为更小、更高效、无冗余的表的过程,目的是消除数据冗余和操作异常(如插入、更新、删除异常)。
举个栗子🌰
想象你的书包🎒乱成一团:课本、作业本、零食混在一起!
规范化就像给书包分层:
• 课本区 → 只放课本
• 作业区 → 只放作业本
• 零食袋 → 单独装零食
结果:找东西快!不重复!不易丢!
数据库同理,每个数据都有自己的“专属格子”!
二、为什么需要规范化?🤔
问题场景
假设有一张学生信息表:
| 学号 | 姓名 | 班级 | 班主任 | 班主任电话 |
|---|---|---|---|---|
| 001 | 小明 | 7年级1班 | 张老师 | 13800001111 |
| 002 | 小红 | 7年级1班 | 张老师 | 13800001111 |
三大问题:
- 冗余:班级和班主任信息重复存储。
- 更新异常:若张老师换电话,需修改多行,易遗漏。
- 插入异常:新班级无学生时,无法单独添加班主任信息。
三、规范化的核心概念
1. 函数依赖(Functional Dependency)
• 科学定义:若表中字段A的值能唯一确定字段B的值,则称B函数依赖于A(记作A → B)。
• 例子:学号 → 姓名(学号确定,姓名就确定)。
2. 候选键(Candidate Key)
• 科学定义:能唯一标识表中每一行的最小字段集合。
• 例子:学号是学生表的候选键。
3. 主键(Primary Key)
• 科学定义:从候选键中选定的一个,作为表的唯一标识符。
四、规范化的“段位” 📊
1. 第一范式(1NF)—— 原子性!
• 科学定义:表中每一列都是不可再分的最小数据单元(属性原子性)。
• 错误示范❌:
| 学号 | 课程成绩 |
|---|---|
| 001 | 语文90,数学95 |
| • 问题:课程成绩包含多个值,非原子。 | |
| • 正确示范✅: | |
| 学号 | 课程 |
| ---- | ---- |
| 001 | 语文 |
| 001 | 数学 |
2. 第二范式(2NF)—— 完全依赖!
• 科学定义:在1NF基础上,所有非主属性完全依赖候选键(消除部分依赖)。
• 例子:
• 表结构:选课表(学号, 课程, 成绩, 班级)
• 候选键:(学号, 课程)
• 问题:班级仅依赖学号(部分依赖候选键),违反2NF!
• 解决方案:拆表!
• 学生表(学号, 班级)
• 成绩表(学号, 课程, 成绩)
3. 第三范式(3NF)—— 直接依赖!
• 科学定义:在2NF基础上,非主属性不传递依赖候选键(即直接依赖,无中间字段)。
• 例子:
• 表结构:学生表(学号, 姓名, 班级, 班主任)
• 问题:班主任依赖班级,班级依赖学号 → 班主任传递依赖学号!
• 解决方案:拆出班级表!
• 学生表(学号, 姓名, 班级)
• 班级表(班级, 班主任)
4. BC范式(BCNF)—— 终极严格版!🔐
• 科学定义:在3NF基础上,所有决定因素(左侧)必须是候选键。
• 即若存在A → B,则A必须是候选键。
• 例子:
• 表结构:选课表(学生ID, 课程, 老师)
• 函数依赖:课程 → 老师(假设每门课只有一位老师)
• 问题:课程不是候选键(候选键是学生ID+课程),违反BCNF!
• 解决方案:拆出课程老师表!
• 选课表(学生ID, 课程)
• 课程表(课程, 老师)
五、BCNF vs 3NF 区别小剧场🎭
• 3NF:允许非主属性传递依赖候选键。
• BCNF:所有函数依赖的左侧必须是候选键!
• 一句话总结:
• 3NF:“间接依赖可以忍。”
• BCNF:“忍不了!所有Boss必须亲自上场!”
六、避坑指南 ⚠️
-
不要过度规范化:
• 表拆得越多,查询时连表越复杂,性能可能下降!
• 如:电商订单表允许冗余商品名称,避免连表查价格。 -
BCNF的代价:
• 表数量增加,需权衡规范化和查询效率。
七、总结 🌟
- 1NF:数据拆到最小原子!(关系模式中,每个分量不可再分)
- 2NF:消灭“半吊子依赖”!(在1NF的基础上,消除了非主属性对码对部分函数依赖)
- 3NF:拒绝“拐弯抹角关系”! (在2NF的基础上,消除了非主属性对码的传递函数依赖)
- BCNF:所有决定因素必须是“超级Boss”(候选键)!(在3NF的基础上,消除了主属性对码的部分依赖和传递依赖)
终极口诀:
一拆到底原子化,
二消部分依赖挂,
三断传递中间茬,
BC大佬全称霸!
相关文章:
数据库系统——规范化1NF~BCNF
数据库规范化完全指南:从零到BCNF,中学生也能秒懂!📚✨ 一、什么是数据库规范化? 科学定义 🔍 数据库规范化是通过一系列规则(范式)将数据库表结构分解为更小、更高效、无冗余的表…...
第十五届蓝桥杯2024JavaB组省赛试题A:报数游戏
简单的找规律题目。题目给得数列,第奇数项是20的倍数,第偶数项时24的倍数。题目要求第n 202420242024 项是多少。这一项是偶数,所以答案一定是24的倍数,并且偶数项的个数和奇数项的个数各占一半,所以最终的答案ans( n…...
Matlab 汽车二自由度转弯模型
1、内容简介 Matlab 187-汽车二自由度转弯模型 可以交流、咨询、答疑 2、内容说明 略 摘 要 本文前一部分提出了侧偏角和横摆角速度作为参数。描述了车辆运动的运动状态,其中文中使用的参考模型是二自由度汽车模型。汽车速度被认为是建立基于H.B.Pacejka的轮胎模…...
关于 2>/dev/null 的作用以及机理
每个进程都有三个标准文件描述符:stdin(标准输入)、stdout(标准输出)和stderr(标准错误)。默认情况下,stderr会输出到终端。使用2>可以将stderr重定向到其他地方,比如…...
学c++的人可以几天速通python?
学了俩天啊,文章写纸上了 还是蛮有趣的...
HTML,CSS,JavaScript
HTML:负责网页的结构(页面元素和内容)。 CSS:负责网页的表现(页面元素的外观、位置等页面样式,如:颜色、大小等)。 Javascript:负责网页的行为(交互效果)。 MDN前端开发文档(MDN Web Docs) HTML HTML(HyperText Markup Language):超文本标记语言超文本:超越了文本的…...
微信小程序面试内容整理-图片优化
在微信小程序中,图片优化是提升加载速度、节省网络带宽和提高用户体验的重要步骤。图片通常是小程序页面中的主要资源,合理的图片优化能显著提高小程序的性能,尤其是在用户网络状况较差的情况下。 1. 选择合适的图片格式 不同的图片格式有不同的特点,选择合适的格式能够有效…...
Rocky Linux 9.x 基于 kubeadm部署k8s 1.32
一、部署说明 1、主机操作系统说明 序号操作系统及版本备注1Rocky Linux release 9下载链接:https://mirrors.163.com/rocky/9.5/isos/x86_64/Rocky-9.5-x86_64-minimal.iso 2、主机硬件配置说明 作用IP地址操作系统配置关键组件k8s-master01192.168.234.51Rocky…...
【每日学点HarmonyOS Next知识】上下拉列表、停止无限循环动画、页面列表跟随列表滑动、otf字体、日期选择
1、HarmonyOS 实现只需要保留上拉加载更多,但是不需要下拉刷新? Refresh通过参数refreshing判断当前组件是否正在刷新,可以控制该参数变化来触发下拉刷新:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5…...
解决git init 命令不显示.git
首先在自己的项目代码右击 打开git bash here 输入git init 之后自己的项目没有.git文件,有可能是因为.git文件隐藏了,下面是解决办法...
利用AI让数据可视化
1. 从问卷星上下载一份答题结果。 序号用户ID提交答卷时间所用时间来源来源详情来自IP总分1、《中华人民共和国电子商务法》正式实施的时间是()。2、()可以判断企业在行业中所处的地位。3、()是指店铺内有…...
神经网络微调技术解析
神经网络微调技术 微调(Fine-tuning)是迁移学习的核心技术,通过在预训练模型基础上调整参数,使其适应特定任务或领域。以下从传统方法、参数高效微调(PEFT)、新兴技术三个维度展开,覆盖主流技术…...
WebLogic XMLDecoder反序列化漏洞(CVE-2017-10271)深度解析与实战复现
0x00 漏洞概述 CVE-2017-10271 是Oracle WebLogic Server WLS Security组件中的远程代码执行漏洞。攻击者通过构造恶意XML请求,利用XMLDecoder反序列化机制绕过安全验证,最终实现服务器权限接管。 影响版本 WebLogic 10.3.6.0WebLogic 12.1.3.0WebLog…...
解决qt中自定插件加载失败,不显示问题。
这个问题断断续续搞了一天多,主要是版本不匹配问题。 我们先来看下 Based on Qt 6.6.0 → 说明 Qt Creator 本身 是基于 Qt 6.6.0 框架构建的。MSVC 2019, 64-bit → 说明 Qt Creator 是使用 Microsoft Visual C 2019 编译器(64 位) 编译的。…...
Git 面试问题,解决冲突
1.问题描述 在多人协作开发中,当多个开发者在同一文件的同一部分进行修改并提交时,Git 无法自动合并这些更改,从而产生代码冲突(Conflict)。冲突的代码会被 Git 标记出来,需要开发者手动解决。 冲突原因 多…...
Apache Shiro 使用教程
Apache Shiro 使用教程 Apache Shiro是一个强大且灵活的开源安全框架,主要用于处理身份验证(Authentication)、授权(Authorization)、加密(Cryptography)和会话管理(Session Manage…...
用maven生成springboot多模块项目
用Maven生成Spring Boot多模块项目,可以按照以下步骤操作: 1. 创建父项目 首先,使用Maven的archetype插件创建一个空的Maven项目作为父项目。打开终端,执行以下命令: mvn archetype:generate -DgroupIdcom.example -…...
【最佳实践】Go 状态模式
设计思路 状态模式的核心在于将对象的行为封装在特定的状态类中,使得对象在不同的状态下表现出不同的行为。每个状态实现同一个接口,允许对象在运行时通过改变其内部状态对象来改变其行为。状态模式使得状态转换更加明确,并且易于扩展新的状…...
智慧社区3.0
项目介绍: 此项目旨在推动成都市探索**超大城市社区发展治理新路**,由三个实验室负责三大内容 1、**研发社区阵地空间管理模块**:AI算法实现态势感知(如通过社区图片和视频、文本,对环境 空间质量、绿视率、安全感分…...
C#语法基础总结
输入和输出 输入 Console.Read(); 从屏幕读取一个字符,并返回该字符所对应的整型数字 Console.ReadLine(); 从屏幕读取一串字符,并返回该字符串 输出 Console.WriteLine(); 输出内容,并换行 Console.Write(); 输出内容,不换行…...
Springboot+Vue登录、注册功能(含验证码)(后端!)
我们首先写一个接口,叫login!然后对传入一个user,因为我们前端肯定是要传过来一个user,然后我们后端返回一个user,因为我们要根据这个去校验!我们还引入了一个hutool的一个东西,在pom文件里面引…...
深入理解 HTML 中的<div>和元素:构建网页结构与样式的基石
一、引言 在 HTML 的世界里,<div>和元素虽看似普通,却扮演着极为关键的角色。它们就像网页搭建过程中的万能积木,能够将各种 HTML 元素巧妙地组合起来,无论是构建页面布局,还是对局部内容进行样式调整ÿ…...
搞定python之八----操作mysql
本文是《搞定python》系列文章的第八篇,讲述利用python操作mysql数据库。相对来说,本文的综合性比较强,包含了操作数据库、异常处理、元组等内容,需要结合前面的知识点。 1、安装mysql模块 PyMySql模块相当于数据库的驱动&#…...
游戏立项时期随笔记录(1)
模拟经营的项目还没有完全结束,这几天又有可能涉及到一个新项目。感想随笔记录一下,防止忘记。今天一天整理这个,搞得今天没时间看数学和AI。 在 Unity3D 游戏前端主程序的立项时期,核心目标是明确技术方向、评估可行性、搭建基础…...
LVGL 中设置 UI 层局部透明,显示下方视频层
LVGL层次 LVGL自上而下分别是layer_sys > layer_top > lv_sreen_active > layer_bottom 即 系统层、顶层、活动屏幕、底层 原理 如果将UI设置为局部透明,显示下方的视频层,不仅仅需要将当前活动屏幕的背景设置为透明,还需要将底层…...
Debezium日常分享系列之:Debezium 3.1.0.Beta1发布
Debezium日常分享系列之:Debezium 3.1.0.Beta1发布 新特性和改进Debezium 平台的首次发布Percona 的最小锁定新的 Oracle 源信息 SCN 和时间戳字段Vitess Epoch/零日期列解析的变化Vitess 二进制排序的 tiny、medium 和 long 文本列的变化CloudEvent traceparent 支…...
21.多态
一、多态概念 多种形态。 静态多态:编译时多态。(函数重载) 动态多态:运行时多态。(继承关系下,调用父类指针或引用,对于不同的对象有不同的行为) 二、多态的定义及实现 1ÿ…...
【蓝桥杯】第十三届C++B组省赛
⭐️个人主页:小羊 ⭐️所属专栏:蓝桥杯 很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~ 目录 试题A:九进制转十进制试题B:顺子日期试题C:刷题统计试题D:修剪灌木试题E…...
C# PaddleOCR字符识别
1 安装Nuget 2 C# using System; using OpenCvSharp; using Sdcb.PaddleOCR; using Sdcb.PaddleOCR.Models.Local; using Sdcb.PaddleOCR.Models; using Sdcb.PaddleInference;namespace ConsoleApp1 {public class MichaelOCR{string imagePath "D:\\BUFFER\\VS\\Text\…...
网络爬虫相关
一、爬虫的基础内容 1、基本概念和用途 1.1、概念: 模拟浏览器、发送请求,获取响应。(只能获取客户端所展示出来的数据) 1.2、特点:知识碎片化,针对不同的网站对应的方法也不同。 爬虫:模拟…...
