数据库基础概念与范式反范式总结
文章目录
- 一、基本概念
- 1、属性
- 2、元组
- 3、关系
- 4、超键
- 5、候选键
- 6、主键
- 7、主属性
- 8、外键
- 9、函数依赖
- 完全依赖
- 二、数据库范式
- 1、第一范式(1NF)
- 2、第二范式(2NF)
- 3、第三范式(3NF)
- 4、巴斯-科德范式(BCNF)
- 5、第四范式(4NF)
- 6、第五范式(5NF)
- 三、反范式
- 四、总结
一、基本概念
我们通过下面这个学生表来深入理解下,假设姓名没有重名的
学生表:姓名,性别,年龄,是否成年,身份证号码,手机号码,学号,班级,学生所在班级中的座位号,班主任
1、属性
属性就是字段,我们表中的每一列
2、元组
元组就是表中的每行数据(即数据库表中的每条记录),在二维表里,元组也称为行。
3、关系
关系(Relation)是指一个表(Table),它由行(Rows)和列(Columns)组成。
4、超键
超键,又叫超码,是能够唯一标识关系中的每个元组的一个或多个属性的集合,也就是在关系中能唯一标识记录的属性集。
超键可以包含多个属性,但不一定是最小的,超键+任何属性=超键
超键的分类:
- 单属性:表中的某个属性
- 组合:由多个属性组成
- 唯一性约束超键:通过在属性上添加唯一性约束,使其成为超键
例如,有一个学生表(学号,姓名,性别,年龄,身份证,班级),那么{学号}、{身份证}、{学号, 姓名}、{学号, 性别}等都是超键,{姓名},{姓名,性别}不是超键。
5、候选键
候选键,又叫候选码,是最小的超键,不含有多余属性的超键,也就是一个属性可以表示超键的话,就没必要使用多个属性。
在一个关系中,可能存在多个候选键
特点:
- 唯一性:候选键的值在关系中是唯一的,没有重复的记录。
- 最小性:候选键是最小的属性集合,即不能再删除任何一个属性而保持唯一性。
例如,还是以学生表(学号,姓名,性别,年龄,身份证,班级)来说,{学号}、{身份证}都是候选键,因为它唯一标识每个学生;{学号, 性别}不是候选键,因为它包含了多余属性。
6、主键
主键,又叫主码,是从候选键中选择的一个键,用于唯一标识关系中的每个元组。
主键必须是唯一且非空的。在关系中,只能有一个主键。
例如,在学生表中,{学号}、{身份证}都可以作为主键。
注:还是要根据场景,来定主键,比如身份证,一般在实际生产中,我们不用它当主键。
7、主属性
主属性,是指在主键中的属性,它们是用来唯一标识每个元组的关键属性。
如果主键包含多个属性,那么这多个属性都是主属性。
例如,在学生表中,{学号}是主键,因此它也是主属性。
8、外键
外键,又叫外码,是指其它表的主键。
例如,在学生表中,{班级}是外键,因为它是班级表的主键
9、函数依赖
一个属性的值(或属性集合的值)对于另一个属性的值(或属性集合的值)具有决定性影响,即给定一个属性(或属性集合)的值,可以唯一确定另一个属性(或属性集合)的值
例如,如果属性A的值决定了属性B的值,可以表示为 A -> B。这意味着在给定A的值的情况下,可以唯一确定B的值。
完全依赖
如果一个属性(或属性集合)对于另一个属性(或属性集合)的值具有完全依赖,那么没有任何冗余的属性可以从该依赖中删除,否则将无法唯一确定被依赖的属性(或属性集合)的值。
例如,假设有一个关系模式R(A, B, C),其中属性A和属性B的组合决定了属性C的值。如果删除属性A或属性B中的任何一个,都无法唯一确定属性C的值,那么我们可以说属性C对于属性A和属性B具有完全依赖。
二、数据库范式
主要有第一范式、第二范式、第三范式、巴斯-科德范式,第四范式和第五范式,前面是后续范式的基础,级别越高,数据库越标准。
1、第一范式(1NF)
1NF=First Normal Form
强调属性都是原子的,不可再拆分
例如,学生表(学号,姓名,班级,学生所在班级中的座位号,班主任,性别,年龄,是否成年,身份证号码),这个表设计符不符合第一范式?
这种得看业务场景了,如果需要展示xx姓同学,比如黄同学,李同学,欧阳同学这种,是不是就不符合,因为姓可能有多个字,比如欧阳索隆,欧阳修,你怎么知道姓欧还是欧阳,这种根本无法拆分,所以,需要把姓和名拆开存,不然不好展示,代码逻辑也比较复杂,所以这里的姓名还可以再拆分,就不符合第一范式了。
2、第二范式(2NF)
非主键属性完全依赖于主键,消除部分依赖
。
假设(A,B)是主键,完全依赖指的是(A,B) ->(C),部分依赖指的是(A)->(C)。
还是以学生表(学号,姓名,班级,学生所在班级中的座位号,班主任,性别,年龄,是否成年,身份证号码)为例,这个表设计符不符合第二范式?
{班级,学生所在班级中的座位号}是主键,但{班主任}由班级决定,没有完全依赖于主键,不符合第二范式,而且会有性能影响,这里数据冗余了,可能导致数据不一致,如果班主任有变更,很多学生记录都要同步修改,不然就出现了数据不一致。
解决方案:拆表,班主任字段拆出去
学生表(学号,姓名,班级,学生所在班级中的座位号,性别,年龄,是否成年,身份证号码)
班级表(班级,班主任)
3、第三范式(3NF)
非主键属性不传递依赖于主键,直接依赖于主键,消除传递依赖
假设A是主键,存在A->B->C,那么说C传递依赖于A。
例如,前面满足第二范式的表结构如下,这个表设计符不符合第三范式?
学生表(学号,姓名,班级,学生所在班级中的座位号,性别,年龄,是否成年,身份证号码)
班级表(班级,班主任)
年龄,是否成年,身份证号码,性别,都是非主键列,“年龄”和“性别”都可以由“身份证号码”推出,“是否成年”可以由“年龄”推出,所以不符合第三范式
解决方案:拆表,把年龄,是否成年,身份证号码拆出去
学生表(学号,姓名,班级,学生所在班级中的座位号,身份证号码)
班级表(班级,班主任)
身份证号码关系表(身份证号码,年龄,性别)
年龄关系表(年龄,是否成年)
上面这种场景,在实际环境中,需要维护多一些表或者Java代码进行判断,都有性能消耗,代码的话,每次查询的时候,代码都要计算1次,那么我们可以采取物化视图,插入年龄的时候,直接计算好,提升性能,具体实现可以参考数据库对象介绍与实践:视图、函数、存储过程、触发器和物化视图
4、巴斯-科德范式(BCNF)
对第三范式的优化,在它基础上,消除对主键子集的依赖而得到的,即非主键属性完全依赖于候选键
。
学生表(学号,姓名,班级,学生所在班级中的座位号,身份证号码)
班级表(班级,班主任)
身份证号码关系表(身份证号码,年龄,性别)
年龄关系表(年龄,是否成年)
这个设计符不符合巴斯-科德范式?
学生所在班级中的座位号完全依赖于{学号,班级},而不依赖于学号,所以符合
5、第四范式(4NF)
要求消除非平凡多值依赖。
假设有一个关系表格包含以下列:学生ID、课程ID、学生成绩1、学生成绩2。如果每个学生ID和课程ID的组合可以决定多个学生成绩的值,而不是只有一个固定的学生成绩值,那么就存在一个非平凡多值依赖。
6、第五范式(5NF)
要求消除非平凡函数依赖。
假设有一个关系表格包含以下列:学生ID、学生姓名、学生年龄。如果每个学生ID都唯一确定一个学生姓名,那么学生ID对学生姓名存在一个非平凡函数依赖。因为在现实生活中,学生ID并不直接决定学生姓名,而是通过其他信息或逻辑来确定。
三、反范式
反范式(Denormalization)是一种数据库设计技术,旨在提高数据库的性能和查询效率,但可能会牺牲一部分数据的一致性和完整性。
在范式化的数据库设计中,数据被分解为多个表,以减少数据冗余和提高数据的一致性。然而,范式化的数据库结构可能导致在进行复杂查询时需要进行多个表的连接操作,从而影响查询性能。
反范式化通过将分解的表重新合并或添加冗余数据,以减少表之间的连接操作,从而提高查询性能。这样可以简化查询的复杂性,减少查询的执行时间。
导致的问题:
- 增加存储空间,数据冗余字段
- 增大更新风险,更新时,需要确保所有相关的冗余数据都得到正确的更新,以保持数据的一致性
四、总结
在实际工作中,一般遵守1NF、2NF、3NF即可,但一般用反范式,可以显著提高性能优势,我们需要自己权衡下,根据具体的应用场景和性能需求来决定使用啥范式。
经验之谈:
- 设计的时候,脑子里要有范式,用于指导设计
- 遵守范式,然后根据业务,再做反范式
相关文章:
数据库基础概念与范式反范式总结
文章目录 一、基本概念1、属性2、元组3、关系4、超键5、候选键6、主键7、主属性8、外键9、函数依赖完全依赖 二、数据库范式1、第一范式(1NF)2、第二范式(2NF)3、第三范式(3NF)4、巴斯-科德范式(…...
tanstack/react-query使用手册
1. useQuery useQuery的使用一、data是后端成功返回的数据, 第一次的值为undefined 二、isLoading是指数据是否正在加载的状态,通常用于判断请求是否还在进行中。当isLoading为true时,表示数据正在加载中,当isLoading为false时&a…...
camera2对摄像头编码h264
MediaCodec编码摄像头数据 前置:保存的一些成员变量 // 摄像头开启的 handler private Handler cameraHandler; // Camera session 会话 handler private Handler sessionHandler; //这里是个Context都行 private AppCompatActivity mActivity; // 这个摄像头所有需…...

Apache solr XXE 漏洞(CVE-2017-12629)
任务一: 复现环境中的漏洞 任务二: 利用XXE漏洞发送HTTP请求,在VPS服务器端接受请求,或收到DNS记录 任务三: 利用XXE漏洞读取本地的/etc/passwd文件 1.搭建环境 2.开始看wp的时候没有看懂为什么是core,然…...

HTML代码混淆技术:原理、应用和实现方法详解
HTML代码混淆是一种常用的反爬虫技术,它可以有效地防止爬虫对网站数据的抓取。本文将详细介绍HTML代码混淆技术的原理、应用以及实现方法,帮助大家更好地了解和运用这一技术。 一、HTML代码混淆的原理 HTML代码混淆是指将HTML源码通过特定的算法进行加…...
quickapp_快应用_系统接口应用
系统接口 在项目中使用到的接口都需要在配置文件manifest.json中声明,不然会报如下警告 [WARN] 请在 manifest.json 文件里声明项目代码中用到的接口: system.storage, service.account, system.package, system.webview[1]检查某app是否在手机上安装 官方文档&a…...

sqlmap400报错问题解决
python sqlmap.py -r sql.txt --batch --techniqueB --tamperspace2comment --risk 3 --force-ssl–batch 选项全部默认 不用再手动输入 –techniqueB 使用布尔盲注,该参数是指出要求使用的注入方式 –tamperspace2comment使用特殊脚本,space2comment是把…...

【S32DS报错】-2-提示Error while launching command:arm-none-eabi-gdb –version错误
目录 1 Error错误提示 2 Error错误原因 3 如何消除Error错误 结尾 【S32K3_MCAL从入门到精通】合集: S32K3_MCAL从入门到精通https://blog.csdn.net/qfmzhu/category_12519033.html 1 Error错误提示 使用S32DSJ-LinK下载程序,在Dedug Configurati…...

Windows核心编程 HOOK
目录 HOOK概述 HOOK API SetWindowsHookExA 函数(winuser.h) UnhookWindowsHookEx 函数(winuser.h) NextHookEx 函数(winuser.h) 局部钩子 全局钩子 为什么全局钩子需要用dll作为过程函数? HOOK概述 本质:Windows消系统的消息过滤器。 全局钩子…...

P4 Qt如何添加qss样式表文件和添加图片资源
目录 前言 01 添加图片资源文件 02 添加qss文件 前言 🎬 个人主页:ChenPi 🐻推荐专栏1: 《C_ChenPi的博客-CSDN博客》✨✨✨ 🔥 推荐专栏2: 《Qt基础_ChenPi的博客-CSDN博客》✨✨✨ 🌺本篇简介 :这一章…...
【华为OD题库-085】路灯照明II-Java
题目 在一条笔直的公路上安装了N个路灯,从位置0开始安装,路灯之间间距固定为100米。 每个路灯都有自己的照明半径,请计算第一个路灯和最后一个路灯之间,无法照明的区间的长度和。输入描述 第一行为一个数N,表示路灯个数…...
附录1、vuepress中的Markdown语法
# 一、标题 # 说明: #后面跟的内容就是标题,一个#就是一级标题,有几个#就是几级标题,例如2级标题就有两个##,markdown的2级和3级标题会默认自动作为子目录, 注意:#后面必须有个空格࿰…...

【matlab程序】matlab画螺旋图|旋转图
%% 数学之美====》螺旋线 % 海洋与大气科学 % 20231205 clear;clc;close all; n=10; t=0:0.01:2pin; R=1; xx=nan(length(t),1);yy=nan(length(t),1); for i=1:length(t) xx(i)=Rcos(t(i)); yy(i)=Rsin(t(i)); R=R+1; end figure set(gcf,‘position’,[50 50 1200 1200],‘col…...
计算三位数每位上数字的和
分数 10 作者 python课程组 单位 福州大学至诚学院 补充程序实现计算: 输入一个三位的整数(不接受实数),求这个三位数每一位上数字的和是多少?例如:输入:382,输出:和为…...

Gavin Wood:财库保守主义偏离了初心,应探索 Fellowship 等更有效的资金部署机制
波卡创始人 Gavin Wood 博士最近接受了 The Kusamarian 的采访,分享了他的过往经历、对治理的看法,还聊到了 AI、以太坊、女巫攻击、财库等话题。本文整理自 PolkaWorld 对专访编译的部分内容,主要包含了 Gavin 对治理、财库提案、生态资金分…...
Linux: sudo: unable to execute /opt/sbin/adm: No such file or directory
因为脚本语言第一行是指定解释器,但是里面包含非法^M字符,导致后续的系统调用,找不到解释器,然后报错误找不到文件。 所以这里存在一个问题,就是错误提示里虽然显示文件找不到,而且也把文件打印了出来。但是非法的字符却没有打印出来。所以导致让人迷惑的可能。 sudo: un…...

一文详解Java单元测试Junit
文章目录 概述、Junit框架快速入门单元测试概述main方法测试的问题junit单元测试框架优点:使用步骤: 使用案例包结构 Junit框架的常见注解测试 概述、Junit框架快速入门 单元测试概述 就是针对最小的功能单元(方法),…...

进制 + 原码,反码,补码
进制转换 整数部分 小数部分 原码 反码 补码 原码转补码: 左边和右边第一个1不变,中间取反。-0 除外。 计算机系统中数值一律用补码来存储的原因 其他 术语 进制表 进制数的表示 详细教程可转 爱编程的大丙...

2024年网络安全行业前景和技术自学
很多人不知道网络安全发展前景好吗?学习网络安全能做什么?今天为大家解答下 先说结论,网络安全的前景必然是超级好的 作为一个有丰富Web安全攻防、渗透领域老工程师,之前也写了不少网络安全技术相关的文章,不少读者朋…...

cocos 关于多个摄像机,动态添加节点的显示问题,需要动态修改layer。(跟随摄像机滚动)(神坑官网也不说明一下)
参考文章:Cocos 3.x 层级Layer - 简书 2D镜头跟随应该怎么实现呢 - Creator 3.x - Cocos中文社区 关于多个摄像机,动态添加节点的显示问题,需要动态修改layer? 场景:在制作摄像机跟随角色移动功能时,新增…...

XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...

第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...

linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...