【MySQL数据库专项 一】一个例子讲清楚数据库三范式
好的,让我们以学校数据库中的一个表为例来说明第一范式(1NF)、第二范式(2NF)和第三范式(3NF)的概念。
什么是数据库三范式
数据库的范式(Normalization)是一组关于数据库设计的规则,目的是减少数据冗余和改善数据完整性。数据库设计通常遵循三个基本的范式,它们分别是:
-
第一范式(1NF):
- 原子性:表的每一列都是不可分割的基本数据项,即表中的所有字段值都是不可再分的原子值。
- 唯一性:表的每一行都是唯一的,可以通过一个主键(Primary Key)来区分。
-
第二范式(2NF):
- 在1NF的基础上,消除非主属性对于码的部分函数依赖。
- 部分函数依赖是指表中的非主属性只依赖于候选键的一部分,而不是整个候选键。
- 为了达到2NF,通常需要把表分解成两个或多个表,以确保每个表中的非主属性只依赖于该表的主键。
-
第三范式(3NF):
- 在2NF的基础上,消除非主属性对于码的传递函数依赖。
- 传递函数依赖是指表中的非主属性依赖于另外一个非主属性,这个非主属性依赖于候选键。
- 达到3NF需要进一步分解表,以确保每个表中的非主属性只依赖于该表的主键,并且没有非主属性依赖于其他非主属性。
这些范式的目标是减少数据冗余(即重复数据),避免更新异常,增强数据的一致性。通常,在实际应用中,设计到第三范式就足够了,但有时候也可能会用到更高级的范式,如BCNF(Boyce-Codd Normal Form)。设计数据库时,需要在规范化和性能之间做出权衡,因为过度规范化可能会导致查询性能下降。
一个例子讲清三范式
从一个未优化的例子逐步拆表
原始表格(未规范化):
假设我们有一个记录学生信息和他们选修课程成绩的表格,如下所示:
| 学生ID | 学生姓名 | 选修课程 | 成绩 | 导师姓名 | 导师电话 |
|---|---|---|---|---|---|
| 001 | 张三 | 数学, 物理 | 85, 90 | 李教授 | 1234567890 |
| 002 | 李四 | 化学 | 78 | 王教授 | 0987654321 |
这个表有多个问题:选修课程和成绩字段包含了多个值,违反了1NF;导师姓名和电话是依赖于学生ID的非主属性,违反了2NF;导师电话依赖于导师姓名,而不是学生ID,违反了3NF。
第一范式(1NF):
要满足1NF,表中的每个字段都必须只有单一的(不可分割的)值,不可以有重复的列。
| 学生ID | 学生姓名 | 选修课程 | 成绩 | 导师姓名 | 导师电话 |
|---|---|---|---|---|---|
| 001 | 张三 | 数学 | 85 | 李教授 | 1234567890 |
| 001 | 张三 | 物理 | 90 | 李教授 | 1234567890 |
| 002 | 李四 | 化学 | 78 | 王教授 | 0987654321 |
现在每个字段都只包含单一值,满足了1NF。
第二范式(2NF):
为了达到2NF,我们需要确保表中的所有非主属性完全依赖于主键(而不是部分依赖于复合主键的一部分)。首先,我们确定主键是学生ID和选修课程的组合。然后,我们将导师信息移到一个单独的表中,因为导师信息依赖于学生ID而不是选修课程。
学生课程表:
| 学生ID | 选修课程 | 成绩 |
|---|---|---|
| 001 | 数学 | 85 |
| 001 | 物理 | 90 |
| 002 | 化学 | 78 |
导师信息表:
| 学生ID | 导师姓名 | 导师电话 |
|---|---|---|
| 001 | 李教授 | 1234567890 |
| 002 | 王教授 | 0987654321 |
现在,学生课程表满足2NF,因为所有非主属性(成绩)都完全依赖于整个主键。
第三范式(3NF):
为了满足3NF,我们需要确保表中的所有非主属性只依赖于主键,不存在传递依赖。我们发现,导师电话依赖于导师姓名,而不是学生ID。为了消除传递依赖,我们将导师信息再次分离成独立的表。
学生课程表(保持不变):
| 学生ID | 选修课程 | 成绩 |
|---|---|---|
| 001 | 数学 | 85 |
| 001 | 物理 | 90 |
| 002 | 化学 | 78 |
学生导师关系表:
| 学生ID | 导师姓名 |
|---|---|
| 001 | 李教授 |
| 002 | 王教授 |
导师信息表:
| 导师姓名 | 导师电话 |
|---|---|
| 李教授 | 1234567890 |
| 王教授 | 0987654321 |
现在,每个表都满足3NF,因为所有的非主属性都直接依赖于主键,不存在非主属性对主键之外的其他非主属性的依赖。通过这些步骤,我们实现了数据的规范化,减少了数据冗余,并提高了数据的完整性。
相关文章:
【MySQL数据库专项 一】一个例子讲清楚数据库三范式
好的,让我们以学校数据库中的一个表为例来说明第一范式(1NF)、第二范式(2NF)和第三范式(3NF)的概念。 什么是数据库三范式 数据库的范式(Normalization)是一组关于数据…...
【笔记】关于期刊
什么是统计源期刊 统计源期刊,全称为“中国科技论文统计源期刊”,也称作中国科技核心期刊,是由中国科技信息研究所(ISTIC)受国家科技部委托,选定的一系列在中国出版的高质量自然科学类学术期刊。这些期刊是…...
SpringMVC-.xml的配置
文章目录 一、对pom.xml的配置二、对web.xml1.第一种方式2. 第二种方式 三、对SpringMVC.xml的配置 一、对pom.xml的配置 <!-- 打包成war包--><packaging>war</packaging> <dependencies><!-- SpringMVC--><dependency><gro…...
Java找二叉树的公共祖先
描述: 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节…...
《Linux高性能服务器编程》笔记03
Linux高性能服务器编程 本文是读书笔记,如有侵权,请联系删除。 参考 Linux高性能服务器编程源码: https://github.com/raichen/LinuxServerCodes 豆瓣: Linux高性能服务器编程 文章目录 Linux高性能服务器编程第07章 Linux服务器程序规范7.1日志7.2用…...
Java毕业设计-基于ssm的网上求职招聘管理系统-第85期
获取源码资料,请移步从戎源码网:从戎源码网_专业的计算机毕业设计网站 项目介绍 基于ssm的网上求职招聘管理系统:前端 jsp、jquery,后端 springmvc、spring、mybatis,角色分为管理员、招聘人员、用户;集成…...
UDP和TCP
UDP协议是一种不可靠的、面向无连接的协议。在通信过程中,它并不像TCP那样需要先建立一个连接,只要(目的地址,端口号,源地址,端口号)确定了,就可以直接发送信息报文,并且…...
【C++】vector容器接口要点的补充
接口缩容 在VS编译器的模式下,类似于erase和insert接口的函数通常会进行缩容,因此,insert和erase行参中的迭代器可能会失效。下图中以erase为例: 代码如下: #include <iostream> #include <vector> #inclu…...
electron-vite中的ipc通信
1. 概述 再electron中,进程间的通信通过ipcMain和ipcRenderer模块,这些通道是任意和双向的 1.1. 什么是上下文隔离进程 ipc通道是通过预加载脚本绑定到window对象的electron对象属性上的 2. 通信方式 2.1. ipcMain(也就是渲染进程向主进…...
探秘网络爬虫的基本原理与实例应用
1. 基本原理 网络爬虫是一种用于自动化获取互联网信息的程序,其基本原理包括URL获取、HTTP请求、HTML解析、数据提取和数据存储等步骤。 URL获取: 确定需要访问的目标网页,通过人工指定、站点地图或之前的抓取结果获取URL。 HTTP请求&#…...
音视频编解码学习记录
目录 学习资料个人git仓库 文章 学习资料 个人git仓库 标准,资料,笔记: https://gitee.com/fedorayang/video_and_audio_codec.git 文章 理解低延迟视频编码的正确姿势: https://cloud.tencent.com/developer/article/1358721...
零基础小白刚刚入门Python的注意点总结~
文章目录 一、注意你的Python版本1.print()函数2.raw_input()与input()3.比较符号,使用!替换<>4.repr函数5.exec()函数 二、新手常遇到的问题1、如何写多行程序?2、如何执行.py文件?3、and,or,not4、True和False…...
从 Context 看 Go 设计模式:接口、封装和并发控制
文章目录 Context 的基本结构Context 的实现和传递机制为什么 Context 不直接传递指针案例:DataStore结论 在 Go 语言中, context 包是并发编程的核心,用于传递取消信号和请求范围的值。但其传值机制,特别是为什么不通过指针传递…...
微信小程序字体大小
微信小程序中可以使用以下CSS样式来设置字体大小: font-size: 12px; // 设置字体大小为12像素在小程序中,可以直接在WXML文件和WXSS文件中使用这个样式。...
L1-062 幸运彩票(Java)
彩票的号码有 6 位数字,若一张彩票的前 3 位上的数之和等于后 3 位上的数之和,则称这张彩票是幸运的。本题就请你判断给定的彩票是不是幸运的。 输入格式: 输入在第一行中给出一个正整数 N(≤ 100)。随后 N 行&#…...
【计算机网络】2、传输介质、通信方向、通信方式、交换方式、IP地址表示、子网划分
文章目录 传输介质双绞线无屏蔽双绞线UTP屏蔽双绞线STP 网线光纤多模光纤MMF单模光纤SMF 无线信道无线电波红外光波 通信方向单工半双工全双工 通信方式异步传输同步传输串行传输并行传输 交换方式电路交换报文交换分组交换 IP地址表示IP地址的定义IP地址的分类无分类编址特殊I…...
【Linux 内核源码分析】堆内存管理
堆 堆是一种动态分配内存的数据结构,用于存储和管理动态分配的对象。它是一块连续的内存空间,用于存储程序运行时动态申请的内存。 堆可以被看作是一个由各个内存块组成的堆栈,其中每个内存块都有一个地址指针,指向下一个内存块…...
Qt 5.15.2 (MSVC 2019)编译 QWT 6.2.0 : 编译MingW或MSVC遇到的坑
MingW下编译QWt 6.2.0 下载qwt最新版本,用git工具 git clone下载源码 git clone https://git.code.sf.net/p/qwt/git qwt-git 或者使用我下载的 qwt 2.6.0 链接:https://pan.baidu.com/s/1KZI-L10N90TJobeqqPYBqw?pwdpq1o 提取码:pq1o 下载…...
模具制造企业ERP系统有哪些?企业怎么选型适配的软件
模具的生产管理过程比较繁琐,涵盖接单报价、车间排期、班组负荷评估、库存盘点、材料采购、供应商选择、工艺流转、品质检验等诸多环节。 有些采用传统管理手段的模具制造企业存在各业务数据传递不畅、信息滞后、不能及时掌握订单和车间生产情况,难以对…...
管理信息系统知识点复习
目录 一、名词解释题1.企业资源规划(ERP)2.面向对象方法:3.电子健康:4.供应链5.数据挖掘6.“自上而下”的开发策略:7.业务流程重组8.面向对象:9.决策支持系统10.聚类11.集成开发环境:12.供应商协同13.数据仓库14.深度学…...
LaTeX表格缩放实战:从手动微调到智能适配
1. LaTeX表格缩放的核心挑战 写论文时最头疼的莫过于遇到超宽表格——明明数据很清晰,一放到LaTeX里就溢出页面边界,要么被拦腰截断,要么挤得文字重叠。我审过上百篇学术论文,发现90%的表格排版问题都源于没有掌握正确的缩放技巧。…...
揭秘LLM System Prompt的逆向工程:从API调试到Prompt Injection实战
1. 什么是System Prompt? 当你和ChatGPT聊天时,有没有好奇过它为什么总是用特定的语气回答?比如你问"今天天气怎么样",它可能会说"根据我的知识库,天气信息需要实时查询..."而不是直接报个假数据。…...
MinIO装好了然后呢?手把手教你配置S3客户端并上传第一个文件(Python/Go示例)
MinIO实战入门:从零配置到多语言文件操作指南 当你第一次登录MinIO控制台,面对空荡荡的界面可能会感到茫然——这就像拿到了一把万能钥匙却不知道门在哪里。本文将带你跨过"安装成功"到"实际使用"的鸿沟,从获取凭证到完成…...
高维问题如何“降维计算”:矩阵映射、卷积与拆分汇总
你在课程里提到一个很重要的工程化思想: 高维问题看起来复杂,但很多计算可以通过“拆分再计算”的方式降维处理 这篇把它整理成一条可复述的主线,重点放在: 为什么能拆拆完怎么汇总和矩阵/卷积的关系是什么 先说明一个常见误解&am…...
AI改写工具爱毕业aibye提供五个技巧,助力30%重复率的论文快速达标
嘿,大家好!我是AI菌。今天咱们来聊聊一个让无数学生头疼的问题:论文重复率飙到30%以上怎么办?别慌,我这就分享5个实用降重技巧,帮你一次搞定,轻松压到合格线以下。这些方法都是我亲身试验过的&a…...
【2026 Python并发新纪元】:从asyncio到subinterpreters再到Rust-Python混合调度——全栈工程师必须掌握的4层无锁架构
第一章:Python无锁GIL环境的范式革命传统CPython解释器受全局解释器锁(GIL)制约,即使在多核CPU上也无法实现真正的并行字节码执行。近年来,随着PyPy的STM分支、RustPython的无GIL设计,以及CPython官方在PEP…...
轻量级C++ HTTP库:cpp-httplib极速集成指南
轻量级C HTTP库:cpp-httplib极速集成指南 【免费下载链接】cpp-httplib A C header-only HTTP/HTTPS server and client library 项目地址: https://gitcode.com/GitHub_Trending/cp/cpp-httplib 核心价值:单文件驱动的开发效率革命 cpp-httplib…...
告别重复造轮子:用快马AI一键生成极客日报的高效数据管道代码
告别重复造轮子:用快马AI一键生成极客日报的高效数据管道代码 作为一个技术资讯类应用的开发者,我深知数据管道的搭建有多耗时。从内容抓取到清洗处理,再到分类归档,每个环节都需要大量重复性编码。最近尝试了InsCode(快马)平台的…...
如何用Applite轻松管理macOS应用:告别复杂的终端命令
如何用Applite轻松管理macOS应用:告别复杂的终端命令 【免费下载链接】Applite User-friendly GUI macOS application for Homebrew Casks 项目地址: https://gitcode.com/gh_mirrors/ap/Applite 还在为macOS上的应用安装和更新烦恼吗?Applite这款…...
STM8/STM32 GPIO触摸按键实现与优化
基于STM8/STM32的GPIO触摸按键实现技术解析1. 触摸按键技术概述1.1 传统方案与MCU实现对比在消费类电子产品中,触摸按键的实现通常有两种主流方案:专用触摸IC方案:集成度高但成本较高MCU GPIO方案:利用通用微控制器实现࿰…...
