MySQL:数据库设计
目录
一、范式
二、第一范式
二、第二范式
三、第三范式
四、设计
(1)一对一关系
(2)一对多关系
(3)多对多关系
一、范式
数据库的范式是一种规则(规范),如果我们想要设计出合理的关系型数据库,我们就要遵守这些不同的规范,而这些不同的规范要求又被称之为范式。
在我们的关系型数据库中有着六种范式:第一范式(1NF)、第二范式(2NF)、第三范(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)、第五范式(5NF,又称完美范式)。
在这些不同的范式中我们认为越高的范式,数据库的冗余就越小,因此普遍认为范式越高对数据之间的关系有着更好的约束性,但是这种更高的范式也可能会导致我们数据库的IO更加繁忙,因此在我们的实际开发中,我们的数据库设计只需要满足第三范式即可。
二、第一范式
定义:数据库表中的每一列都是不可分割的原子数据项,它们不能是集合,数组 ,对象等非原子数据。
注意:在关系型数据库的设计中,满足第一范式是对关系模式的基本要求。不满足第一范式的数据库就不能被称为关系数据库。
如果我们单看完定义,我们可能不太了解什么是不可分割的原子项。我们接下来可以举一个简单的例子,我们设计一张学生表,在这个学生表中,存有我们的学生的个人信息和学校信息。
我们设计出了这样的一个学生表,我们观察这个学生表的每一个列,我们可以发现,在我们的学校这一列,它其实是一个对象,是可以继续进行拆分的,我们可以将他拆分为:学校名,学校地址,学校电话,邮箱等等这些项,因此在这种还存在可以继续往下拆分的列时,我们称这个学生表是不满足第一范式的。
那么,如果我们想要让我们这张学生表是满足第一范式的话,我们该怎么做呢,其实很简单,我们只需要将我们的学校列用拆分好的列进行替代即可。
此时这样的一张新的学生表就是满足我们的第一范式了,同时我们发现我们此时的这张表的所有列都可以用基本数据类型进行表示,那么我们就可以认为,在我们的关系型数据库中如果我们的每一个列都可以用基本数据类型进行表示,那么我们就说他是天然满足第一范式的。
二、第二范式
定义:在满足第一范式的基础上,不存在非关键字段对任意候选键的部分函数依赖。如果我们的表中在定义了复合主键的情况下,存在部分函数依赖,我们就说它不满足第二范式。
候选键:可以唯一标识一行数据的列或列的组合,可以从候选键中选一个或者多个当做表的主键。
根据我们的定义来看,我们可能并不了解,我们其实可以对这个定义进行一个简化,那就是:在满足第一范式(1NF)的情况下,表中的每一个非主键字段都是完全函数依赖于主键字段的。
当然,在这里可能有有所迷惑什么是完全函数依赖,我们接下来可以举一个例子来解释,我们设计一张成绩表,在这张表中存入我们的学生信息,学生课程,和学生所获课程学分和成绩。在这张表中我们将学号+课程名定义成复合主键
但是在这张表中我们其实可以发现,我们学生信息(学生信息中除主键外的字段)是靠我们的学号这个字段来标识的,而我们的课程信息是靠课程名这个字段标识的,我们的成绩是靠这个两个字段标识的。 在这种非主键字段,不是全部依赖一个整个主键字段而是依赖主键中部分列的情况,我们就说他存在部分函数依赖,因此它是不满足第二范式的。
并且在这种不满足部分函数依赖的情况下,它会导致许多的问题,而这些问题也就是我们为什么要引入范式的原因。
不满足第二范式可能会出现的问题,我们还是以上面设计的这张学生表来说明问题。
1、数据冗余
在上面这张表中,我们其实可以看到学生的信息在每一行中会重复出现,例如第一行和第四行的学生信息。
2、更新异常
例如如果我们要去调整Java的学分,那么我们就要更新表中所有Java的学分,但是如果在更新的过程中出现中断,导致一些数据更新成功,另一些数据更新失败,那么这样就会导致同一个Java学科会出现不同的学分,这就是我们的更新异常。
3、插入异常
如果我们想要只插入学生的学号,姓名,性别和年龄,而不插入课程名,此时就会出现插入异常,因为我们定义的主键是学号+课程名的复合主键,我们还需要添加我们的课程名
4、删除异常
当此时这个学生已经毕业了,那么我们留着他的成绩肯是没有用的,所有我们就要将他他的信息和成绩删除,但是如果我们要进行删除,我们同时也需要将课程和学分一并删除才能成功,这样就会导致了我们的数据库中的课程和学分会消失。
那么,如果我们想要解决上述问题,我们就要满足我们的第二范式,我们可以将上述的成绩表进行拆分,分为学生表,课程表,成绩表
此时我们的学生表和课程表的非关键字段是和我们的各自的主键id列,完全依赖的,同时这两个
表的每一列都可以用基本数据类型表示,那么这两个列也是天然满足第一范式的。
此时我们得到了上述的两个表,接下我们就可以设计得到我们的成绩表了,根据我们的学生id和课程id,得到成绩表的复合主键,根据这个复合主键的对应关系就能得到了我们哪个学生,参加了哪门考试得到了什么成绩。这样就不存在数据冗余和部分函数依赖,同时我们要单独插入或删除我们的学生信息和课程信息也是可以的。
注意:我们的第二范式强调的是部分函数依赖,如果我们的表中主键只有一个列,那么我们就说它是天然满足第二范式的。
三、第三范式
定义:在满足第二范式的基础上,不存在非关键字段,对任一候选键的传递依赖。
我们来看下面这张学生表:
在这张表中,我们可以根据学号去得到我们学生的所在学院,同时也可以得到学院的电话和邮箱,但其实我们知道正常来说,一个学生的学号是不可能得到,他所在学院的电话和邮箱的,而这种由学号->学院->学院电话的传递关系,我们就称它为传递依赖。
而为了防止这种传递依赖我们就引入了新的规范:第三范式。
我们可以将上表拆分成两个表,学生表和学院表
我们可以通过学院编号进行外键的链接,这样我们的学号就只能找到我们的学生信息,而学院的信息需要通过学院编号来获得, 这样就解决了我们的传递依赖。
四、设计
1、从设计上来说,我们要从现实业务中抽象得到概念类
2、然后从中确定实体和实体之间的关系,并画出E-R图
3、最后根据我们的E-R图完成我们SQL语句的编写并创建数据库
而我们这里的E-R图又称实体-关系图,它是由三个部分所组成的分别是:实体,属性,关系。
- 实体:即数据对象,用矩形框表示。
- 属性:实体的特性,用椭圆形或圆角矩形表示
- 关系:实体之间的联系,用菱形框表示,并标明关系的类型,并用直线将相关实体与关系连接起来。
而对于这种实体间的关系,由分为三种:一对一关系、一对多关系、多对多关系。
(1)一对一关系
比如我们的用户实体与账户实体就是一对一的关系。
即一个用户的信息只能登录一个账户。
(2)一对多关系
比如我们的学生实体和班级实体,就是一对多的关系。
即一个班级里有多个学生。
(3)多对多关系
比如我们的学生实体和选课实体,就是多对多的关系
即一个学生可以选多门课程,一门课程也可以被多个学生选。
对于多对多关系,我们也可以使用中间表进行记录,比如一个学生参加了某一门课程的考试得到了相应的成绩。
好了,今天的分享就到这里了,还请大家多多关注,我们下一篇见!
相关文章:
MySQL:数据库设计
目录 一、范式 二、第一范式 二、第二范式 三、第三范式 四、设计 (1)一对一关系 (2)一对多关系 (3)多对多关系 一、范式 数据库的范式是一种规则(规范),如果我们…...
OpenManus与OWL部署及体验报告
OpenManus与OWL对任务的执行结果均不及Manus;二者比较,Owl达成率更高;二者使用过程中均会消耗大量tokens,单个问题成本高。 一、部署 OpenManus:https://github.com/mannaandpoem/OpenManus.git OWL:https…...
【Pandas】pandas DataFrame pow
Pandas2.2 DataFrame Binary operator functions 方法描述DataFrame.add(other)用于执行 DataFrame 与另一个对象(如 DataFrame、Series 或标量)的逐元素加法操作DataFrame.add(other[, axis, level, fill_value])用于执行 DataFrame 与另一个对象&…...
Red:1靶场环境部署及其渗透测试笔记(Vulnhub )
环境介绍: 靶机下载: https://download.vulnhub.com/red/Red.ova 本次实验的环境需要用到VirtualBox(桥接网卡),VMware(桥接网卡)两台虚拟机(网段都在192.168.152.0/24࿰…...
【多源01BFS】Codeforce:Three States
题干 翻译 给定一个 nm 的网格地图,包含以下元素: .:表示荒地(可以修建道路)。 #:表示岩石(不可通行)。 数字 1、2、3:分别表示三个国家的位置。 目标:将…...
在深度学习中FLOPs和GFLOPs的含义及区别
在深度学习中,FLOPs和GFLOPs是衡量计算性能的关键指标,但两者的定义和应用场景不同: 1. 定义与区别 • FLOPs(Floating-point Operations) 表示模型或算法执行时所需的浮点运算总次数,用于衡量模型的计算复…...
SpringBoot入门实战(项目搭建、配置、功能接口实现等一篇通关)
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 SpringBoot入门实战(项目搭建、配…...
昆仑万维开源SkyReels-V2,解锁无限时长电影级创作,总分83.9%登顶V-Bench榜单
昆仑万维开源了全球首个基于扩散强迫框架(Diffusion-forcing)的无限时长视频生成模型——SkyReels-V2。这一模型以总分83.9%的优异成绩登顶权威评测V-Bench1.0榜单,并在质量维度获得84.7%的评分,刷新了开源视频生成技术的天花板。…...
精选面试题
1、js中set和map的作用和区别? 在 JavaScript 中,Set 和 Map 是两种非常重要的集合类型 1、Set 是一种集合数据结构,用于存储唯一值。它类似于数组,但成员的值都是唯一的,没有重复的值。Set 中的值只能是唯一的,任何…...
【技术派后端篇】技术派中 Session/Cookie 与 JWT 身份验证技术的应用及实现解析
在现代Web应用开发中,身份验证是保障系统安全的重要环节。技术派在身份验证领域采用了多种技术方案,其中Session/Cookie和JWT(JSON Web Token)是两种常用的实现方式。本文将详细介绍这两种身份验证技术在技术派中的应用及具体实现…...
【CAPL实战:以太网】对IPv4报文的Payload部分进行分片并创建分片包
As we know,TCP/IP协议栈网络层接收到来自上层的数据时,并不是简单地添加报头发送出去,而是会受到来自网卡配置参数MTU的约束。也就是从网卡上发送出去的以太网帧报文的数据部分的长度不能大于MTU值。即网络层头部 + 有效载荷不能大于MTU。 所以网络层在发送上层的数据时,…...
Spring Security认证流程
认证是Spring Security的核心功能之一,Spring Security所提供的认证可以更好地保护系统的隐私数据与资源,只有当用户的身份合法后方可访问该系统的资源。Spring Security提供了默认的认证相关配置,开发者也可以根据自己实际的环境进行自定义身…...
Spring Security基础入门
本入门案例主要演示Spring Security在Spring Boot中的安全管理效果。为了更好地使用Spring Boot整合实现Spring Security安全管理功能,体现案例中Authentication(认证)和Authorization(授权)功能的实现,本案…...
Axure疑难杂症:母版菜单设置打开链接后菜单选中效果
亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢! Axure产品经理精品视频课已登录CSDN可点击学习https://edu.csdn.net/course/detail/40420 课程主题:菜单打开链接后子菜单选中效果 主要内容:母版设计、选中效果 应用场景:页面赋值 案例展示: 案例视频:...
4月份最新---Meta发明了一种很新的Transformer
在自然语言处理领域,当模型处理长上下文时,如何在纷繁的 Token 中精准捕捉关键信息、过滤无关干扰,始终是注意力机制优化的核心方向。标准多头注意力(Multi-Head Attention, MHA)通过查询 - 键 - 值(Q-K-V)的点积相似性计算注意力权重,虽能定位单个 Token 级别的语义关…...
Spring Boot知识点详解
打包部署 <!‐‐ 这个插件,可以将应用打包成一个可执行的jar包;‐‐> <build><plugins> <plugin> <groupId>org.springframework.boot</groupId><artifactId>spring‐boot‐maven‐plugin</artifactId&g…...
基于 EFISH-SBC-RK3588 的无人机多光谱/红外热成像边缘计算方案
一、硬件架构设计 核心算力平台(EFISH-SBC-RK3588) 处理器性能:搭载 8 核 ARM 架构(4Cortex-A762.4GHz 4Cortex-A551.8GHz),集成 6 TOPS NPU 与 Mali-G610 GPU,支持多光谱图像实时融…...
字典与集合——测试界的黑话宝典与BUG追捕术
主题:“字典是测试工程师的暗号手册,集合是BUG的照妖镜” 一、今日目标 ✅ 掌握字典的「键值对暗号体系」与集合的「去重妖法」✅ 开发《测试工程师黑话词典》,让新人秒变老司机✅ 统计自动化测试结果中的高频BUG类型(附赠甩锅指…...
QT构建即时通讯应用--WebSocket全面解析与实战指南
概述 WebSocket协议因其低延迟和双向通信的能力而成为了现代Web和桌面应用程序的首选,Qt框架提供了强大的WebSocket支持,使得开发者可以轻松地集成这一技术到自己的项目中 WebSocket简介 WebSocket是一种在单个TCP连接上进行全双工通信的协议。它允许服务器主动向客户端推…...
复杂性决策-思维训练
思维训练 1.模式识别 观察、复杂、不确定、波动、模糊 –找出必要和非必要因素 –识别重大威胁和机遇 2.系统分析 为复杂情景构建系统心智模型 利用模型识别模式做出预测,指定有效策略 3.心智敏锐度 利用不同层次的分析探索挑战的能力,对其他利益相关方在…...
缓存集群技术深度解析:从原理到实战
缓存集群技术深度解析:从原理到实战 一、缓存集群核心定位与架构选型 1. 集群模式核心价值 缓存集群通过数据分片、高可用保障、水平扩展解决单节点瓶颈,核心能力包括: 数据分片:将数据分散到多个节点,突破单节点内…...
Qt C++/Go/Python 面试题(持续更新)
目录 1、封装、继承、多态是什么? 2、final标识符的作用是什么? 3、介绍一下虚函数 4、介绍一下智能指针 5、介绍一下左值、右值、左值引用、右值引用 6、指针和引用有什么区别? 7、define和const的区别是什么? 8、C程序的…...
Spring Cloud Alibaba VS Spring Cloud
Spring Cloud Alibaba 与 Spring Cloud 组件对比 服务发现与注册中心 功能Spring CloudSpring Cloud Alibaba对比说明核心组件EurekaNacosNacos 支持动态配置管理、健康检查更灵活,且提供 DNS 服务发现能力。健康检查…...
containerd 配置代理
1.systemd unit file 为 containerd 服务创建一个 systemd 插入目录 mkdir /etc/systemd/system/containerd.service.d/创建名为 /etc/systemd/system/containerd.service.d/http-proxy.conf 的文件 添加 HTTP_PROXY 环境变量 [Service] Environment"HTTP_PROXYhttp:/…...
专家系统的基本概念解析——基于《人工智能原理与方法》的深度拓展
一、什么是专家系统 (一)基本思想与定义 1. 核心思想:知识与推理的分离 迄今为止,关于专家系统还没有一个公认的严格定义,一般认为: (1)它是一个智能程序系统; &…...
什么是公链?公链项目有哪些?公链项目开发
公链技术全景解析:定义、生态与开发指南(2025年深度版) 一、公链的本质与核心特征 1.1 公链的定义 公链(Public Blockchain)是一种完全开放、无需许可的区块链网络架构,其核心特征在于去中心化、透明…...
如何解析商品详情页面
解析商品详情页面是爬虫开发中的一个重要环节。由于商品详情页面通常包含丰富的信息,如商品名称、价格、描述、图片等,因此需要仔细分析页面结构并提取所需数据。以下是一个详细的步骤指南,展示如何使用 Java 和 Jsoup 解析商品详情页面。 一…...
Android 混合开发实战:统一 View 与 Compose 的浅色/深色主题方案
整个应用(包括 View 和 Compose 部分)的浅色/深色模式保持一致。以下是完整的解决方案: 全局配置方案 1. 基础主题设置 在 res/values/themes.xml 和 res/values-night/themes.xml 中定义统一的主题: <!-- values/themes.x…...
三国杀专业分析面板,立志成为桌游界的stockfish
三国杀专业分析面板 (SGSFish) GitHub仓库: 本项目是一个基于 Python 实现的三国杀专业分析面板,旨在模拟玩家决策过程,通过量化评估动作实体(卡牌/技能)的价值、考虑它们之间的相互影响(包括基于作用域的…...
解析 select 函数
解析 select 函数 select 函数是 Unix/Linux 系统中用于多路复用的系统调用,主要用于在多个文件描述符(file descriptors)上等待事件的发生。它允许程序同时监视多个 I/O 通道,并在任意一个通道准备好进行 I/O 操作时通知程序&am…...
对话模型和补全模型区别
对话模型和补全模型区别 什么是对话模型、补全模型 什么是 Completion 最基本地说,文本模型是一个经过训练的大型数学模型,旨在完成一项单一任务:预测下一个 token 或字符。这个过程被称为 completion,在您的旅程中您会经常遇到这个术语。 例如,当使用 completion 文本…...
计算机图形学实践:结合Qt和OpenGL实现绘制彩色三角形
以下是使用Qt和OpenGL实现绘制彩色三角形并添加颜色选择按钮的步骤: 一、创建OpenGL绘制组件 继承QOpenGLWidget实现自定义绘制类: // myopenglwidget.h #include <QOpenGLWidget> #include <QOpenGLFunctions_3_3_Core> #include <QO…...
十分钟应急响应——自定义工具链整合实战
核心思路 结合群联AI云防护的API和自定义脚本,实现攻击检测、节点切换、日志分析的端到端自动化。 技术实现步骤 1. 实时攻击检测脚本 使用Python监听群联系统日志,识别攻击特征: # monitor_attack.py import json import subprocess from…...
SpringCloud微服务架构设计与实践 - 面试实战
SpringCloud微服务架构设计与实践 - 面试实战 第一轮提问 面试官:马架构,请问在SpringCloud微服务架构中,如何实现服务注册与发现? 马架构:在SpringCloud中,Eureka是常用的服务注册与发现组件。服务提供…...
每日算法——快乐数、两数之和
202. 快乐数 class Solution { public:bool isHappy(int n) {unordered_set<int> result_set;while(true){int sum 0;while(n>0){sum (n%10)*(n%10);n/10;}if(sum1){return true;}else{if(result_set.find(sum) ! result_set.end()){return false;}result_set.inser…...
反射,枚举,lambda表达式
目录 反射枚举的使用Lambda表达式函数式接口语法Lambda表达式语法精简 变量捕获Lambda在集合List中的使用 反射 作用:在Java代码中,让一个对象认识到自己 比如一个类的名字,里面的方法,属性等 让程序运行的过程,某个对…...
matlab 绘图
1.三维绘图 % 原始数据(按行输入:x y z) data [1 2 3 ;5 56 234 ;32 34 67 1 2 5 ];% 提取坐标并生成网格(适用于surf函数的网格格式) x data(:,1); % X坐标(行数对应Y轴) y data…...
AI日报 - 2025年04月25日
🌟 今日概览(60秒速览) ▎🤖 AGI突破 | OpenAI o3模型展现行动能力,英国发布RepliBench评估AI自主复制风险,DeepMind CEO担忧AGI协调挑战。 模型能力向行动和自主性演进,安全与协调成为焦点。 ▎💼 商业动向…...
力扣面试150题--基本计算器
Day 31 题目描述 思路 (逆波兰表达式扩展) 初次思路:此题我遇到了几个难点 如何处理()如何处理-1和2-1中的负数还是减法问题 1-(-(12))如何处理多余的空格 我的做法如…...
各种各样的bug合集
一、连不上数据库db 1.可能是密码一大包东西不对; 2.可能是里面某个port和数据库不一样(针对于修改了数据库但是连不上的情况); 3.可能是git代码没拉对,再拉一下代码。❤ 二、没有这个包 可能是可以#注释掉。❤ …...
【25软考网工】第三章(3)虚拟局域网VLAN
一、虚拟局域网VLAN 1. VLAN基础 定义:根据管理功能、组织机构或应用类型对交换局域网进行分段而形成的逻辑网络。例如将大型网络划分为多个VLAN(如VLAN1-4)。 优势: 管理便利:便于对不同部门或功能进行分组管理安全隔…...
SFINAE(Substitution Failure Is Not An Error)
C 中的 SFINAE(替换失败并非错误) SFINAE(Substitution Failure Is Not An Error)是 C 模板元编程的核心机制之一,允许在编译时根据类型特性选择不同的模板实现。以下通过代码示例和底层原理,逐步解析 SFI…...
学习记录:DAY17
我的学习日志:前端开发练习 前言 只想畏缩在自己的床上,什么也不想干😰 我觉得有必要调整一下复习方针,不然容易白学。 我确实不太爱复习的人,尽量每天抽出时间来复习昨天的内容,周末总体复习一下一个星期…...
LibrePhotos本地部署打造个人云相册安全存储和分享家庭照片(1)
文章目录 前言1.关于LibrePhotos2.本地部署LibrePhotos3.LibrePhotos简单使用4. 安装内网穿透5.配置LibrePhotos公网地址6. 配置固定公网地址 前言 手机里塞满了珍贵回忆,却担心一不小心就被偷看?别怕,今天我就教你一个绝招——使用LibrePho…...
Android插拔U盘导致黑屏问题排查
问题现象: 车机大屏偶先插拔带音乐的U盘,导致车机系统短暂黑屏的情况。 日志中可以看到vold进程unmount了两次分区,一次是U盘分区,一次是/storage/emulated/0分区: I vold : Start killProcesses: /mnt/media_rw/…...
Android Build Variants(构建变体)详解
Android Build Variants(构建变体)是 Android 开发中用于生成不同版本应用程序的一种机制。它允许开发者根据不同的需求,如不同的应用市场、不同的功能模块、不同的环境配置等,从同一个代码库中生成多个不同的 APK。 组成部分 B…...
看一看 中间件Middleware
中间件(Middleware)是介于操作系统与应用程序之间的一层软件 它为分布式应用程序提供了统一的通信、数据交换、服务调用、消息传递等能力。 它的作用就像“胶水”,连接各个系统组件。 文章目录 消息队列缓存中间件数据库中间件服务注册与发现…...
ai人才需要掌握什么
在人工智能(AI)技术重塑全球产业格局的今天,AI人才的核心竞争力已超越单一技术维度,演变为“技术深度+人文广度+伦理自觉”的三维能力模型。本文将从技术能力体系、跨学科思维、伦理与治理三个层面,解析AI人才的核心能力框架,并针对技术局限性提出系统性应对策略。 一、…...
RISC-V低功耗MCU动态时钟门控技术详解
我来分享一下RISC-V核低功耗MCU的动态时钟门控技术实现: 这款MCU通过硬件级时钟门控电路实现了模块级的功耗管理。当外设(如UART、SPI)处于闲置状态时,系统会自动切断其时钟信号,减少无效翻转功耗。同时支持多电压域协…...
第十天 Shader编程:编写简单表面着色器 Addressable资源管理系统 DOTS(面向数据技术栈)入门
前言 作为Unity初学者,在实现复杂场景时经常会遇到性能瓶颈。本文将带你通过四个关键技术的实战学习,掌握现代Unity开发的核心优化方案: Shader编程 - 编写表面着色器控制物体渲染Addressable系统 - 实现高效资源管理DOTS技术栈 - 解锁百万…...