MySQL三范式
欢迎大家到我的博客浏览。MySQL三范式 | YinKai's Blog
简介
三大范式是 MySQL 数据库设计表结构所遵循的规范和指导方法,目的是为了减少冗余,建立结构合理的数据库,从而提高数据存储和使用的性能。
三大范式之间是有依赖关系的,比如第二范式是在第一范式的基础上建设的,第三范式是在第二范式的基础上建设的。
简单来说,就是原子性、唯一性、无传递性。
第一范式 - 1NF
遵循原子性。即,表中字段的数据,不可再分。例如下述表结构:
| 员工编号 | 姓名 | 年龄 |
|---|---|---|
| 001 | 运营部小明 | 19 |
| 002 | 技术部小美 | 28 |
| 003 | 销售部小张 | 20 |
上述表结构中,姓名字段是可以进行再拆分的,因此它不符合第一范式。符合第一范式的表结构如下:
| 员工编号 | 部门 | 姓名 | 年龄 |
|---|---|---|---|
| 001 | 运营部 | 小明 | 19 |
| 002 | 技术部 | 小美 | 28 |
| 003 | 销售部 | 小张 | 20 |
但也并不是所有情况,都需要符合第一范式,例如:
| 员工编码 | 姓名 | 省 | 市 | 区 |
|---|---|---|---|---|
| 001 | 小张 | 江西省 | 南昌市 | 东湖区 |
| 002 | 小黄 | 广东省 | 佛山市 | 禅城区 |
| 003 | 小高 | 湖北省 | 武汉市 | 新洲区 |
所以,范式只是一个参考,更多的是需要根据实际情况设计表结构。
第二范式 - 2NF
在满足第一范式的情况下,遵循唯一性,消除部分依赖。即 表中任意一个主键或任意一组联合主键,可以确定除该主键外的所有的非主键值。
通俗一点讲就是,一个表只能描述一件事情,且由该表的主键确定。
例如,主键为学号,则可以确定姓名、年龄等学生信息。
| 学号 | 姓名 | 年龄 |
|---|---|---|
| 001 | 小美 | 18 |
| 002 | 小张 | 19 |
| 003 | 小明 | 20 |
主键为课程名称,就可以确定该课程学分、成绩等信息。
| 课程名称 | 成绩 | 学分 |
|---|---|---|
| 语文 | 90 | 3 |
| 数学 | 90 | 2 |
| 英语 | 90 | 3 |
不遵循第二范式,可能会造成下述后果:
-
数据冗余:将不同类型的信息存储在同一张表中可能导致数据冗余。例如,在学生表中,如果每个学生都有多个课程,将学生和课程信息合并存储可能导致数据复制。如果有两名学生,每人选修三门课程,表中会包含6条记录,其中的学生信息将重复。
-
更新数据不方便:当需要更新特定信息时,如果数据存储在同一张表中,更新可能变得不太方便。举例来说,如果需要更改某门课程的学分,必须在整个表中搜索相关记录并更新,这可能是一个繁琐的过程。但如果将数据拆分到不同的表中,只需在包含相关信息的表中进行更新,更加便捷。
-
插入数据不方便或可能导致异常情况:在某些情况下,插入数据可能变得复杂或引发异常。举例如下:
-
假设主键是学号或课程名称,当需要插入新的课程信息时,必须精心规划哪些学生将选择该课程。这可能需要指定为哪些学生插入对应的课程信息。此外,如果还没有相关成绩信息,可能需要将成绩字段置为空,以后再进行更新。
-
假设主键是学号和课程名称的联合主键,插入课程信息时,如果没有学生选择该课程,可能会导致学号主键字段缺失,从而无法插入相关信息。
-
第三范式 - 3NF
在满足第二范式的情况下, 消除传递依赖。即,在任一主键都可以确定所有非主键字段的情况下,不能存在某非主键字段 A 可以获取 某非主键字段 B。
举个例子,如下
| 学号 | 姓名 | 班级 | 班主任 |
|---|---|---|---|
| 001 | 小美 | 一年级(3)班 | 陈老师 |
这个表中,学号是主键,它可以唯一确定姓名、班级、班主任,符合第二范式,但是在非主键字段中,我们可以可以通过班级推导出该班级的班主任,所以他不符合第三范式。
上述的表要满足第三范式,可以像下面这样设计:
1.学生表
| 学号 | 姓名 | 班级 |
|---|---|---|
| 001 | 小美 | 一年级(3)班 |
2.班级表
| 班级 | 班主任 |
|---|---|
| 一年级(3) | 陈老师 |
通过把班主任和班级的映射关系做成另一张表,就可以消除表中的传递依赖。
总结
-
第一范式(1 NF):字段不可再拆分
-
第二范式(2 NF):表中任意一个主键或者任意一组联合主键,可以唯一确定除该主键外的所有非主键值。
-
第三范式(3 NF):在任一主键都可以确定所有非主键字段值的情况下,不能存在某非主键字段 A 可以获取 某非主键字段 B。
相关文章:
MySQL三范式
欢迎大家到我的博客浏览。MySQL三范式 | YinKais Blog 简介 三大范式是 MySQL 数据库设计表结构所遵循的规范和指导方法,目的是为了减少冗余,建立结构合理的数据库,从而提高数据存储和使用的性能。 三大范式之间是有依赖关系的,…...
玩转微服务-技术篇-JSDOC教程
一. 简介 JSDoc 3 是一个用于 JavaScript 的API文档生成器,类似于 Javadoc 或 phpDocumentor。可以将文档注释直接添加到源代码中。JSDoc 工具将扫描您的源代码并为您生成一个 HTML 文档网站。 JSDoc 是一种用于 JavaScript 代码文档注释的标记语言和工具。它不仅…...
Android12之logcat日志显示颜色和时间(一百六十七)
简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…...
【Windows】内网穿透实现hMailServer远程发送邮件
目录 前言1. 安装hMailServer2. 设置hMailServer3. 客户端安装添加账号4. 测试发送邮件5. 安装cpolar6. 创建公网地址7. 测试远程发送邮件8. 固定连接公网地址9. 测试固定远程地址发送邮件 前言 hMailServer 是一个邮件服务器,通过它我们可以搭建自己的邮件服务,通过cpolar内网…...
深信服技术认证“SCSA-S”划重点:SQL注入漏洞
为帮助大家更加系统化地学习网络安全知识,以及更高效地通过深信服安全服务认证工程师考核,深信服特别推出“SCSA-S认证备考秘笈”共十期内容,“考试重点”内容框架,帮助大家快速get重点知识~ 划重点来啦 深信服安全服务认证工程师…...
Leetcode-二叉树oj题
1.二叉树的前序遍历 144. 二叉树的前序遍历https://leetcode.cn/problems/binary-tree-preorder-traversal/这个题目在遍历的基础上还要求返回数组,数组里面按前序存放二叉树节点的值。 既然要返回数组,就必然要malloc一块空间,那么我们需…...
软件磁盘阵列(software RAID)
RAID-0 等量模式(各个磁盘平均存放文件) RAID-1 镜像模式(一个文件存放两个磁盘) RAID 01 RAID 10 组合模式 RAID 5 三块以上磁盘,记录文件和同位码(存放不通磁盘,通过同…...
浏览器安全攻击与防御
前言 浏览器是我们访问互联网的主要工具,也是我们接触信息的主要渠道。但是,浏览器也可能成为攻击者利用的突破口,通过各种手段,窃取或篡改我们的数据,甚至控制我们的设备.本文将向大家介绍一些常见的浏览器安全的攻击…...
vue生命周期、工程化开发和脚手架
1、前言 持续学习记录总结中,vue生命周期、工程化开发和脚手架 2、Vue生命周期 Vue生命周期:就是一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个阶段:① 创建 ② 挂载 ③ 更新 ④ 销毁 1.创建阶段:创建响应式数据 2.挂…...
文件搜索工具HoudahSpot mac中文版特点
HoudahSpot mac是一款文件搜索工具,它可以帮助用户快速准确地找到文件和文件夹,支持高级搜索和过滤,同时提供了多种视图和操作选项,方便用户进行文件管理和整理。 HoudahSpot mac软件特点 高级搜索和过滤功能:软件支持…...
maven中scope和optional区别
文章目录 1. Scope(作用范围):2. Optional(可选项): 1. Scope(作用范围): Maven的<scope>元素用于指定依赖项的作用范围,即依赖项在构建和运行时的可见…...
《ChatGPT实操应用大全》探索无限可能
🗣️探索ChatGPT,开启无限可能🚀 文末有免费送书福利!!! ChatGPT是人类有史以来最伟大的发明。他能写作、绘画、翻译、看病、做菜、编程、数据分析、制作视频、解高等数学题…,他会的技能…...
基于helm的方式在k8s集群中部署gitlab - 部署(一)
文章目录 1. 背景说明2. 你可以学到什么?3. 前置条件4. 安装docker服务(所有节点)5. 部署k8s集群5.1 系统配置(所有节点)5.2 安装kubelet组件(所有节点)5.2.1 编写kubelet源5.2.2 安装kubelet5.2.3 启动kubelet 5.3 集…...
flask web开发学习之初识flask(二)
文章目录 一、创建程序实例并注册路由1. 为视图绑定绑定多个URL2. 动态URL 二、启动开发服务器1. 自动发现程序实例2. 管理环境变量3. 使用pycharm运行服务器4. 更多的启动选项5. 设置运行环境6. 调试器7. 重载器 一、创建程序实例并注册路由 app.py # 从flask包中导入flask类…...
利用异或、取反、自增bypass_webshell_waf
目录 引言 利用异或 介绍 eval与assert 蚁剑连接 进阶题目 利用取反 利用自增 引言 有这样一个waf用于防御我们上传的文件: function fun($var): bool{$blacklist ["\$_", "eval","copy" ,"assert","usort…...
K8s Docker实践三
单主机创建多个node 在Mac桌面上部署多个Kubernetes节点可以使用Minikube工具。Minikube是一个轻量级的Kubernetes工具,它可以在单个主机上创建一个虚拟集群。以下是在Mac桌面上使用Minikube部署多个Kubernetes节点的步骤: 安装Minikube,运…...
记录 | pip加速配置
以下方法不仅适用于linux,也适用于mac 临时加速配置: pip install -i https://pypi.douban.com/simple --trusted-host pypi.douban.com matplotlib3.4.0其中可选源有: https://pypi.douban.com/simple http://mirrors.aliyun.com/pypi/sim…...
HarmonyOS开发—Arkts循环渲染(ForEach)深入运用详解【鸿蒙专栏-16】
文章目录 ArkTS ForEach接口详解与应用示例ForEach接口概述介绍接口描述参数说明键值生成规则默认规则组件创建规则首次渲染非首次渲染使用场景高级用法条件渲染逻辑LazyForEach的性能优化渲染结果预期ForEach的错误使用案例与性能降低渲染结果非预期渲染性能降低结语ArkTS For…...
uniapp挽留提示2.0
项目需求:有时候挽留的ui是全屏的,用page-container也可以。后来产品提了个问题,手机侧滑的时候没那么顺畅(就是一用侧滑,就显示出来,产品要的方案是如下图,emmm大概是这个意思) 后面…...
电源控制系统架构(PCSA)之系统分区电压域
目录 4.1 电压域 4.1.1 系统逻辑 4.1.2 Always-On逻辑 4.1.3 处理器Clusters 4.1.4 图形处理器 4.1.5 其他功能 4.1.6 SoC分区示例 本章描述基于Arm组件的SoC划分为电压域和电源域。 所描述的选择并不详尽,只是可能性的一个子集。目的是描述基于Arm组件的SoC…...
docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...
嵌入式学习笔记DAY33(网络编程——TCP)
一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...
【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)
LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 题目描述解题思路Java代码 题目描述 题目链接:LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...
DBLP数据库是什么?
DBLP(Digital Bibliography & Library Project)Computer Science Bibliography是全球著名的计算机科学出版物的开放书目数据库。DBLP所收录的期刊和会议论文质量较高,数据库文献更新速度很快,很好地反映了国际计算机科学学术研…...
python打卡day49@浙大疏锦行
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 一、通道注意力模块复习 & CBAM实现 import torch import torch.nn as nnclass CBAM(nn.Module):def __init__…...
OpenGL-什么是软OpenGL/软渲染/软光栅?
软OpenGL(Software OpenGL)或者软渲染指完全通过CPU模拟实现的OpenGL渲染方式(包括几何处理、光栅化、着色等),不依赖GPU硬件加速。这种模式通常性能较低,但兼容性极强,常用于不支持硬件加速…...
