数据库系统——规范化1NF~BCNF

news2025/3/19 5:24:07

数据库规范化完全指南:从零到BCNF,中学生也能秒懂!📚✨


一、什么是数据库规范化?

科学定义 🔍

数据库规范化是通过一系列规则(范式)将数据库表结构分解为更小、更高效、无冗余的表的过程,目的是消除数据冗余和操作异常(如插入、更新、删除异常)。

举个栗子🌰

想象你的书包🎒乱成一团:课本、作业本、零食混在一起!
规范化就像给书包分层:
课本区 → 只放课本
作业区 → 只放作业本
零食袋 → 单独装零食
结果:找东西快!不重复!不易丢!
数据库同理,每个数据都有自己的“专属格子”


二、为什么需要规范化?🤔

问题场景

假设有一张学生信息表

学号姓名班级班主任班主任电话
001小明7年级1班张老师13800001111
002小红7年级1班张老师13800001111

三大问题

  1. 冗余:班级和班主任信息重复存储。
  2. 更新异常:若张老师换电话,需修改多行,易遗漏。
  3. 插入异常:新班级无学生时,无法单独添加班主任信息。

三、规范化的核心概念

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必须亲自上场!”


六、避坑指南 ⚠️

  1. 不要过度规范化
    • 表拆得越多,查询时连表越复杂,性能可能下降!
    • 如:电商订单表允许冗余商品名称,避免连表查价格。

  2. BCNF的代价
    • 表数量增加,需权衡规范化和查询效率。


七、总结 🌟

  1. 1NF:数据拆到最小原子!(关系模式中,每个分量不可再分)
  2. 2NF:消灭“半吊子依赖”!(在1NF的基础上,消除了非主属性对码对部分函数依赖)
  3. 3NF:拒绝“拐弯抹角关系”! (在2NF的基础上,消除了非主属性对码的传递函数依赖)
  4. BCNF:所有决定因素必须是“超级Boss”(候选键)!(在3NF的基础上,消除了主属性对码的部分依赖和传递依赖)

终极口诀

一拆到底原子化,
二消部分依赖挂,
三断传递中间茬,
BC大佬全称霸!

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

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

相关文章

第十五届蓝桥杯2024JavaB组省赛试题A:报数游戏

简单的找规律题目。题目给得数列,第奇数项是20的倍数,第偶数项时24的倍数。题目要求第n 202420242024 项是多少。这一项是偶数,所以答案一定是24的倍数,并且偶数项的个数和奇数项的个数各占一半,所以最终的答案ans( n…

Matlab 汽车二自由度转弯模型

1、内容简介 Matlab 187-汽车二自由度转弯模型 可以交流、咨询、答疑 2、内容说明 略 摘 要 本文前一部分提出了侧偏角和横摆角速度作为参数。描述了车辆运动的运动状态,其中文中使用的参考模型是二自由度汽车模型。汽车速度被认为是建立基于H.B.Pacejka的轮胎模…

学c++的人可以几天速通python?

学了俩天啊,文章写纸上了 还是蛮有趣的

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…

解决git init 命令不显示.git

首先在自己的项目代码右击 打开git bash here 输入git init 之后自己的项目没有.git文件,有可能是因为.git文件隐藏了,下面是解决办法

利用AI让数据可视化

1. 从问卷星上下载一份答题结果。 序号用户ID提交答卷时间所用时间来源来源详情来自IP总分1、《中华人民共和国电子商务法》正式实施的时间是()。2、()可以判断企业在行业中所处的地位。3、()是指店铺内有…

解决qt中自定插件加载失败,不显示问题。

这个问题断断续续搞了一天多,主要是版本不匹配问题。 我们先来看下 Based on Qt 6.6.0 → 说明 Qt Creator 本身 是基于 Qt 6.6.0 框架构建的。MSVC 2019, 64-bit → 说明 Qt Creator 是使用 Microsoft Visual C 2019 编译器(64 位) 编译的。…

智慧社区3.0

项目介绍: 此项目旨在推动成都市探索**超大城市社区发展治理新路**,由三个实验室负责三大内容 1、**研发社区阵地空间管理模块**:AI算法实现态势感知(如通过社区图片和视频、文本,对环境 空间质量、绿视率、安全感分…

Springboot+Vue登录、注册功能(含验证码)(后端!)

我们首先写一个接口,叫login!然后对传入一个user,因为我们前端肯定是要传过来一个user,然后我们后端返回一个user,因为我们要根据这个去校验!我们还引入了一个hutool的一个东西,在pom文件里面引…

搞定python之八----操作mysql

本文是《搞定python》系列文章的第八篇,讲述利用python操作mysql数据库。相对来说,本文的综合性比较强,包含了操作数据库、异常处理、元组等内容,需要结合前面的知识点。 1、安装mysql模块 PyMySql模块相当于数据库的驱动&#…

LVGL 中设置 UI 层局部透明,显示下方视频层

LVGL层次 LVGL自上而下分别是layer_sys > layer_top > lv_sreen_active > layer_bottom 即 系统层、顶层、活动屏幕、底层 原理 如果将UI设置为局部透明,显示下方的视频层,不仅仅需要将当前活动屏幕的背景设置为透明,还需要将底层…

21.多态

一、多态概念 多种形态。 静态多态:编译时多态。(函数重载) 动态多态:运行时多态。(继承关系下,调用父类指针或引用,对于不同的对象有不同的行为) 二、多态的定义及实现 1&#xff…

【蓝桥杯】第十三届C++B组省赛

⭐️个人主页:小羊 ⭐️所属专栏:蓝桥杯 很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~ 目录 试题A:九进制转十进制试题B:顺子日期试题C:刷题统计试题D:修剪灌木试题E&#xf…

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\…

多环境开发-Profiles

在实际的项目开发中,我们通常会涉及多个环境,如开发环境(dev)、测试环境(test)和生产环境(pro)。在不同的环境下,程序的配置信息会有所不同,例如连接的数据库…

《TCP/IP网络编程》学习笔记 | Chapter 18:多线程服务器端的实现

《TCP/IP网络编程》学习笔记 | Chapter 18:多线程服务器端的实现 《TCP/IP网络编程》学习笔记 | Chapter 18:多线程服务器端的实现线程的概念引入线程的背景线程与进程的区别 线程创建与运行pthread_createpthread_join可在临界区内调用的函数工作&#…

MambaVision:一种Mamba-Transformer混合视觉骨干网络

摘要 我们提出了一种新型混合Mamba-Transformer主干网络,称为MambaVision,该网络专为视觉应用而设计。我们的核心贡献包括重新设计Mamba公式,以增强其对视觉特征的高效建模能力。此外,我们还对将视觉Transformer(ViT&…

深度学习-服务器训练SparseDrive过程记录

1、cuda安装 1.1 卸载安装失败的cuda 参考:https://blog.csdn.net/weixin_40826634/article/details/127493809 注意:因为/usr/local/cuda-xx.x/bin/下没有卸载脚本,很可能是apt安装的,所以通过执行下面的命令删除: a…

学习单片机需要多长时间才能进行简单的项目开发?

之前有老铁问我,学单片机到底要多久,才能进行简单的项目开发?是三个月速成,还是三年磨一剑? 今天咱们就来聊聊这个话题,我不是什么高高在上的专家,就是个踩过无数坑、烧过几块板子的“技术老友”…

stm32 L432KC(mbed)入门第一课

目录 一. 前言 二. 专栏意义 三. MS入门第一课 一. 前言 新的一年MS课程又开始了,同时也到了该专栏的第三个年头。在前两年中,该专栏帮助了很多第一次接触单片机的同学。其中,有的同学订阅专栏是为了更好的完成并且通过MS这门课程&#xf…