当前位置: 首页 > news >正文

数据库基础概念与范式反范式总结

文章目录

  • 一、基本概念
    • 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、巴斯-科德范式&#xff08…...

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级标题会默认自动作为子目录, 注意:#后面必须有个空格&#xff0…...

【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? 场景:在制作摄像机跟随角色移动功能时,新增…...

freeswitch编译mod_av支持webrtc MCU通话

系统环境 一、FS相关网站 二、第三方库安装 1.apt安装 2.指定版本sofia-sip安装 3.指定版本spandsp安装 4.指定版本libks安装 5.指定版本openssl安装 三、指定版本FS安装 1.CPPFLAGS配置 2.编译器版本 3.FS配置编译 四、FS,fs_cli运行,模块加载 附录 1.安…...

K8s 入门指南(一):单节点集群环境搭建

前言 官方文档:Kubernetes 文档 | Kubernetes 系统配置 CentOS 7.9(2 核 2 G) 本文为 k8s 入门指南专栏,将会使用 kubeadm 搭建单节点 k8s 集群,详细讲解环境搭建部署的细节,专栏后面章节会以实战代码介绍…...

python socket编程6 - 使用PyQt6 开发UI界面实现TCP server和TCP client单机通讯的例子

使用PyQt6 开发UI界面实现TCP server和TCP client单机通讯的示例。 一、PyQt6 实现的界面 二、TCP server代码的修改示意 界面提供网络参数的配置,以及提供人机交互过程中的数据获取和显示。 1、把上面的server代码封装成两个部分 A、class Server 负责接受UI界面…...

centos上安装并持久化配置LVS

1 实验背景 1)系统版本:centos7.8 2)虚拟机:3个centos虚拟机,(其中一个做Director Server,另外两个做Real Server) 3) LVS大致有NAT ,DR ,Tun这三种模式,这里搭建一个典型的DR模式的LVS Direc…...

多线程并发Ping脚本

1. 前言 最近需要ping地址,还是挺多的,就使用python搞一个ping脚本,记录一下,以免丢失了。 2. 脚本介绍 首先检查是否存在True.txt或False.txt文件,并在用户确认后进行删除,然后从IP.txt的文件中读取IP地…...

SpringBoot Seata 死锁问题排查

现象描述:Spring Boot项目,启动的时候卡住了,一直卡在那里不动,没有报错,也没有日志输出 但是,奇怪的是,本地可以正常启动 好吧,姑且先不深究为什么本地可以启动而部署到服务器上就无…...

文章解读与仿真程序复现思路——电力系统自动化EI\CSCD\北大核心《考虑两阶段鲁棒优化配置的多微网合作博弈》

这个标题涉及到多个概念,让我们逐步解读: 考虑两阶段鲁棒优化配置: 两阶段: 指的是在解决问题或进行优化时,可能存在两个不同的阶段或步骤。这表明问题的解决不是一步完成的,而是需要经过多个步骤或阶段。鲁…...

Redis常见类型

常用类型String字符串类型Hash字典类型List列表类型Set集合类型ZSet有序集合类型 Java程序操作Redis类型代码操作Redis 常用类型 String字符串类型 使用方式: 使用场景: Hash字典类型 字典类型(Hash) 又被成为散列类型或者是哈希表类型&#xff0…...

深入了解数据库锁:类型、应用和最佳实践

目录 1. 引言 2. 数据库锁的基本概念 2.1 悲观锁和乐观锁 2.2 排他锁和共享锁 3. 悲观锁的应用场景 3.1 长事务和大事务 3.2 并发修改 3.3 数据库死锁 4. 悲观锁的最佳实践 4.1 精细控制锁的粒度 4.2 避免死锁 4.3 考虑乐观锁 5. 案例分析 5.1 银行系统的转账操作…...

python3.5安装教程及环境配置,python3.7.2安装与配置

大家好,小编来为大家解答以下问题,python3.5安装教程及环境配置,python3.7.2安装与配置,现在让我们一起来看看吧! python 从爬虫开始(一) Python 简介 首先简介一下Python和爬虫的关系与概念&am…...