数据库的三大范式
1.为什么需要数据库设计
设计数据表的时候,要考虑很多的问题:
- 用户需要哪些数据,我们在数据表中要保存哪一些数据
- 怎么保证数据表中的数据的正确性
- 如何降低数据表的冗余度
- 开发人员怎么才能更方便的使用数据库
如果数据库设计得不合理的话,可能导致下面的几种问题:
- 设计容易,信息重复,存储空间浪费
- 数据更新,插入,删除的异常
- 不能正确表示信息
- 丢失有效信息
- 程序性能差
我们可以看出设计良好的数据库是很重要的,它有下面的优点:
- 节省数据的存储空间
- 能够保证数据的完整性
- 方便进行数据库应用系统的开发
设计数据库,我们得重视数据表的设计,为了建立冗余度小,结构合理的数据库,设计数据库必须遵循一定的规则。
2.范式(Normal Formal)
2.1范式概述
关系型数据库中,关于数据表设计的基本原则,规则就称为范式,范式是我们在设计数据库结构过程中需要遵循的规则和指导方法。
不过,有的时候为了提高某一些查询性能,我们还需要破坏范式规则,也就是反规范化。
2.2 键和相关属性的概念
范式的定义会用到主键和候选键,我们先来看看相关的概念,数据库中的键是由一个或多个属性组成的,我们来看一下数据表中常用的几种键和属性的定义。
举例:
这里有两个表:
球员表(player):球员编号丨姓名身份证号「年龄|球队编号
球队表(team):球队编号丨主教练丨球队所在地
- 超键:对于球员表来说,超键就是包括球员编号或者身份证号的任意组合,比如(球员编号)
姓名)(身份证号,年龄)等。 - 候选键:就是最小的超键,对于球员表来说,候选键就是(球员编号)或者(身份证号)。
- 主键:我们自己选定,也就是从候选键中选择一个,比如(球员编号)。
- 外键:球员表中的球队编号
- 主属性、非主属性:在球员表中,主属性是(球员编号)(身份证号),其他的属性(姓名)(年龄)(球队编号)都是非主属性。
2.3第一范式(1NF)
数据表中的每个字段的值是不可再拆分的最小数据单元
第一范式主要是保证数据表中的每一个字段的值必须具有原子性
属性的原子性是主观的,我们要根据实际项目的需求来设计,比如说地址,如果项目没有说要细分为省,市,县,镇这么具体的话,我们一般就可以不拆分。
2.4第二范式(2NF)
第二范式要求在满足第一范式的基础上,还要满足数据表里的每一条数据记录,都是可唯一标识的,而且所有的非主键字段,都必须完全依赖主键,不能只依赖主键的一部分。
如果知道主键的所有属性的值,我们就可以检索任何元组(行)的任何属性的任何值(要求中的主键可以拓展替换为候选键)
比如说,在成绩表(学号,课程号,成绩)关系中,(学号,课程号)可以决定成绩,因为一个学生可以选多门课,一门课也可以被多个学生选择,所以学号或课程号都不能单独决定成绩。
所以(学号,课程号)——>成绩就是完全依赖关系。
比赛表里面包含球员编号,姓名,年龄,比赛编号,比赛实际和比赛场地等属性,候选键和主键都是(球员编号,比赛编号),我们可以通过候选键(主键)来决定下面的关系。
(球员编号,比赛编号)——>(姓名,年龄,比赛时间,比赛场地,得分)
但是这个数据表不满足第二范式,因为数据表中的字段之间还存在下面的对应关系:
(球员编号)——>(姓名,年龄)
(比赛编号)——>(比赛时间,比赛场地)
非主属性并非完全依赖候选键,这样会产生下面的问题。
- 数据冗余:如果一个球员参加m场比赛,那么球员的姓名和年龄就重复了m-1次,一个比赛可能有n个球员参加,比赛时间和地点就重复了n-1次
- 插入异常:如果我们要添加一场新的比赛,但是这时还没有确定参加的球员都有谁2,那么就没发插入
- 删除异常:我们想删除某个球员编号,但是如果没有单独保存比赛表的话,就会同时把比赛信息删除掉
- 更新异常:如果我们调整了某个比赛时间,那么数据表所有的这个比赛的时间都得进行调整,不然就会出现同一场比赛但是时间不同的情况。
为了避免上述情况,我们可以把球员比赛表设计成下面的三张表。
表名 | 属性(字段) |
---|---|
球员player表 | 球员编号,姓名,年龄等属性 |
比赛game表 | 比赛编号,比赛时间,比赛场地等属性 |
球员比赛关系player_game表 | 球员编号,比赛编号,得分等属性 |
这样的话,每张数据表都符合第二范式,就避免了异常情况的发生
第二范式要求实体的属性完全依赖主关键字,如果存在不完全依赖,那么这个属性和主关键字的这一部分就应该分离处理形成一个新的实体,新实体和原来实体之间是一对多的关系
2.5第三范式(3NF)
- 第三范式建立在已经满足第二范式的基础上
- 数据表中的每一个非主键字段都和主键字段直接相关
- 也就是说数据表中的所有非主键字段不能依赖于其他非主键字段
- 这个规则的意思是所有非主属性之间不能有依赖关系,它们是互相独立的
- 这里的主键可以拓展成为候选键
2.6范式的优缺点
优点:
- 数据的标准化有助于消除数据库中的数据冗余
第三范式通常被认为在性能,扩展性和数据完整性方面达到了最好的平衡
缺点:
- 降低了查询效率,因为范式等级越高,设计出来的表就越多,进行数据查询的时候就可能需要关联多张表,不仅代价昂贵,而且可能会使得一些索引失效
- 范式只是提出设计的标准,实际设计的时候,我们可能为了性能和读取效率违反范式的原则,通过增加少量的冗余或重复的数据来提高数据库的读取性能,减少关联查询,实现空间换时间的目的
3.反范式化
3.1概述
- 遵循业务优先的原则
- 首先满足业务需求,再进来减少冗余
- 有时候我们想要对查询效率进行优化,反范式化也是一种优化思路,我们可以通过在数据表中增加冗余字段来提高数据库的读性能。
3.2 反范式的新问题
反范式虽然可以通过空间换实际,提升查询的效率,但是反范式也会带来一些新问题
- 存储空间变大了
- 一个表中字段做了修改,另外一个表中冗余字段也要同步进行修改,不然会导致数据不一致
- 如果用存储过程了支持数据的更新,删除等操作,如果操作频繁,就会消耗系统资源
- 在数据量小的情况下,反范式不能体现性能的优势,可能还会让数据库的设计更加复杂。
3.3反范式的适用场景
当冗余信息能大幅度提高查询效率的时候,我们才会采取反范式的优化。
增加冗余字段的建议
增加冗余冗余字段一定要符合下面的两个条件,满足下面的两个条件才可以考虑增加冗余字段
①这个冗余字段不需要经常进行修改
②这个冗余字段查询的时候不可或缺
4.BCNF(巴斯范式)
这个表符合第三范式
相关文章:

数据库的三大范式
1.为什么需要数据库设计 设计数据表的时候,要考虑很多的问题: 用户需要哪些数据,我们在数据表中要保存哪一些数据怎么保证数据表中的数据的正确性如何降低数据表的冗余度开发人员怎么才能更方便的使用数据库 如果数据库设计得不合理的话,可…...

【MT7628】开发环境搭建-Fedora12安装之后无法上网问题解决
1.按照如下图所示,打开Network Connections 2.点击Network Connections,弹出如下界面...

[Android Studio]Android 数据存储-文件存储学习笔记-结合保存QQ账户与密码存储到指定文件中的演练
🟧🟨🟩🟦🟪 Android Debug🟧🟨🟩🟦🟪 Topic 发布安卓学习过程中遇到问题解决过程,希望我的解决方案可以对小伙伴们有帮助。 📋笔记目…...

【openGauss实战9】深度分析分区表
📢📢📢📣📣📣 哈喽!大家好,我是【IT邦德】,江湖人称jeames007,10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】!😜&am…...

XSS跨站脚本攻击剖析与防御:初识XSS
目录 跨站脚本介绍 1. 什么是XSS跨站脚本 2. XSS跨站脚本实例 3. XSS漏洞的危害 XSS的分类 1. 反射型XSS 2. 持久性XSS XSS构造 1. 利用< >标记注射Html /Javascript 2. 利用HTML标签属性值执行XSS 3. 空格回车Tab 4. 对标签属性值转码 5. 产生自己的事件…...

Python 高级编程之网络编程 Socket(六)
文章目录一、概述二、Python socket 模块1)Socket 类型1、创建 TCP Socket2、创建 UDP Socket2)Socket 函数1、服务端socket函数2、客户端socket函数3、公共socket函数三、单工,半双工以及全双工通信方式的区别四、单工,半双工以及…...

centos学习记录
遇到的问题及其解决办法 centos7安装图形化界面 yum groupinstall ‘X Window System’ yum groupinstall -y ‘GNOME Desktop’ 安装完成后输入init 5进入图形化界面 centos7安装vmware-tools 第一步卸载open-vm-tools 输入命令 yum remove open-vm-tools 输入命令 reboot 在…...

为什么说网络安全是风口行业?
前言 “没有网络安全就没有国家安全”。当前,网络安全已被提升到国家战略的高度,成为影响国家安全、社会稳定至关重要的因素之一。 网络安全行业特点 1、就业薪资非常高,涨薪快 2021年猎聘网发布网络安全行业就业薪资行业最高人均33.77万&…...
12-PHP使用过的函数 111-120
111、rowCount if ($stmt->execute($data)) {//true//读:select//写:insert,update,delete,成功后会返回表中受影响的记录数量//!rowCount() 返回受影响的记录数量if ($stmt->rowCount() > 0) {echo 新增成功,id . $db->lastInsertId() . <hr>;} else {//…...

【JavaWeb项目】简单搭建一个前端的博客系统
博客系统项目 本项目主要分成四个页面: 博客列表页博客详情页登录页面博客编辑页 该系统公共的CSS样式 common.css /* 放置一些各个页面都会用到的公共样式 */* {margin: 0;padding: 0;box-sizing: 0; }/* 给整个页面加上背景 */ html, body{height: 100%; }body {backgrou…...
iPerf3 -M参数详解,场景分析
本文目录iPerf3 -M参数说明几个典型测试场景中应该如何设定合适的-M参数值理想局域网模型(无丢包,无抖动)高丢包,无抖动模型高丢包,高抖动模型(网络质量比较差,IP转发路径变化频繁)总…...
java的基本语法以及注意事项
Java 基础语法一个 Java 程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作。下面简要介绍下类、对象、方法和实例变量的概念。对象:对象是类的一个实例,有状态和行为。例如,一条狗是一个对象,它…...

matlab搭建IAE,ISE,ITAE性能指标
目录前言准备IAEISEITAE前言 最近在使用matlab搭建控制系统性能评价指标模型,记录一下 准备 MATLAB R2020 IAE IAE函数表达式如下所示: IAE函数模型如下所示: ISE ISE函数表达式如下所示: ISE函数模型如下所示ÿ…...

docker安装mysql
在安装Mysql之前,我们可以先查看一下我们的镜像,输入命令: docker images 能发现,镜像里面只有一个Nginx,并没有Mysql 然后我们可以像上一篇安装Nginx一样,安装Mysql镜像。 输入以下命令,安装…...
Leetcode 回溯详解
回溯法 回溯法有“通用解题法”之称,用它可以系统地搜索问题的所有解。回溯法是一个既带有系统性又带有跳跃性的搜索算法。 在包含问题的所有解的解空间树中,按照深度优先搜索(DFS))的策略,从根结点出发深度探索解空间树。当探索…...

AI_Papers:第一期
2023.02.06—2023.02.12 文摘词云 Top Papers Subjects: cs.CL 1.Multimodal Chain-of-Thought Reasoning in Language Models 标题:语言模型中的多模式思维链推理 作者:Zhuosheng Zhang, Aston Zhang, Mu Li, Hai Zhao, George Karypis, Alex Sm…...

C/C++内存管理
C/C内存管理C/C内存分布C语言中内存管理的方式:malloc/calloc/realloc/freeC内存管理方式内置类型自定义类型operator new 与operator deletenew和delete的实现原理内置类型自定义类型定位new表达式(placement-new)new/delete与malloc/free的区别C/C内存分布 我们先…...

【大数据hive】hive 函数使用详解
一、前言 在任何一种编程语言中,函数可以说是必不可少的,像mysql、oracle中,提供了很多内置函数,或者通过自定义函数的方式进行定制化使用,而hive作为一门数据分析软件,随着版本的不断更新迭代,…...

彻底搞懂分布式系统服务注册与发现原理
目录 引入服务注册与发现组件的原因 单体架构 应用与数据分离...
安卓Camera2用ImageReader获取NV21源码分析
以前如何得到Camera预览流回调 可以通过如下方法,得到一路预览回调流 Camera#setPreviewCallbackWithBuffer(Camera.PreviewCallback),可以通过如下方法,设置回调数据的格式,比如 ImageFormat.NV21 Camera.Parameters#setPreview…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...

《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...

自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...