数据库基础概念与范式反范式总结
文章目录
- 一、基本概念
- 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? 场景:在制作摄像机跟随角色移动功能时,新增…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...

【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...
laravel8+vue3.0+element-plus搭建方法
创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...