数据库设计的三范式超详细详解

article/2025/10/17 8:19:31

目录

写在前面

第一范式(1NF):原子性(存储的数据应该具有“不可再分性”)

第二范式(2NF):唯一性 (消除非主键部分依赖联合主键中的部分字段)(一定要在第一范式已经满足的情况下)

第三范式(3NF):独立性,消除传递依赖(非主键值不依赖于另一个非主键值)

总结


写在前面

很多数据库设计者,都是按照自己的性子和习惯来设计数据库数据表,其实不然。

其实,数据库的设计也有要遵循的原则。

范式,就是规范,就是指设计数据库需要(应该)遵循的原则。

每个范式,都是用来规定某种结构或数据要求——后一范式都是在前一范式已经满足的情况用来“加强要求”(这句话很重要)

这也是面试中经常会问到的“数据库三范式指的是什么?”,很多小伙伴只知道原子性、唯一性、独立性,但是知其然而不知其所以然。

在这里,让你彻底弄明白,什么叫数据库的三范式!

第一范式(1NF):原子性(存储的数据应该具有“不可再分性”)

不良做法如下,“学生”一列有多项信息都合在一起了,不再具有原子性,所以应该分开:

实际中,原子性还是比较容易理解的。

修改后:

第二范式(2NF):唯一性 (消除非主键部分依赖联合主键中的部分字段)(一定要在第一范式已经满足的情况下)

需要实现每一行数据具有唯一可区分的特性,并不能有部分依赖关系。

通常,给一个表加主键(也是推荐做法),就可以做到“唯一可区分”。

但主键有这样情况:

设定一个字段为主键:此时,表示该一个字段的值就可以明确确定一行数据。

设定多个字段为主键:表示只有这多个字段的值都确定后才能确定一行数据。此时也称为“联合主键”。

什么叫依赖:

如果确定一个表中的某个数据(A),则就可以确定该表中的其他另一个数据(B),则我们说:B依赖于A。

实际上,一个表只要有主键,则其他非主键一定是依赖于主键的。

什么叫“部分依赖”:

如果确定一个表中的某个数据组合(A,B),则就可以确定该表中的其他另一个数据(C),则我们说:C依赖于(A,B)(此时A,B通常就是做出主键)。

但:如果某个数据D,它只依赖于数据A,或者说,A一确定,则D也可以确定,此时我们就称为“数据D部分依赖于数据A——可见部分依赖是指某个非主键字段,依赖于联合主键字段的其中部分字段

好了,说了这么多,估计大家也都糊涂了,接下来上例子吧!

不良做法:

这个表虽然满足了第一范式,但是也很明显的感受到它的冗余性,其中学生信息和课程信息是冗余的。

以上表如果是需要确定主键,就得是学生+课程作为联合主键。

第二范式要求非主键字段的值必须完全依赖主键(不能部分依赖),所以以上表中,学分是依赖课程的,成绩是依赖学生的。

修改后,分为学生信息表、课程信息表、学生学分表:

学生信息表:只代表学生的个人信息,主键使用id以防止重名。

课程信息表:这里的主键可以不用id,使用课程名称也可以,不会有重名。

学生学分表:学生和课程,确定一个学分,这里学生id和课程id作为联合主键来对应一条成绩。

第三范式(3NF):独立性,消除传递依赖(非主键值不依赖于另一个非主键值)

在一个具有主键的表中,假设主键为A,其必然其他非主键都依赖于该主键,比如:B依赖于A,C依赖于A,D依赖于A。。。。。。

但同时:如果该表中的某个字段B的值一确定,就能够确定另一个字段的值C,则我们称为C依赖于B。

那么,就出现了:

C依赖B,B依赖A——这就是传递依赖。

则消除该传递依赖的的通常做法,就是将C依赖于B的数据,分离到另一个表中。

好了,还是蒙蒙的吧,上例子:

不良例子:

以上表既满足第一范式也满足第二范式,非主键字段也完全依赖于主键字段。

但是,院系电话字段,其实是依赖院系字段的。也就是说,院系电话字段是非主键值,而依赖了另一个非主键值-院系。所以就不符合第三范式。

改良:

一个学生表,一个院系表,一目了然。

如果修改了院系信息,对应着也不需要修改学生信息表。但是如果还是使用以上不良例子的话,修改其中一个院系信息,得对应修改所有所属该院系的学生,

总结

通常,在实践中,满足3范式只要做到“一个表只存一种数据”基本就可以实现。

另外,范式不是绝对要求,有时候我们为了数据的使用方便,还会(需要)故意违反范式

具体设计需求,还需要在工作中多多练习,寻找到最适合,最方便的数据库设计方案出来~


http://chatgpt.dhexx.cn/article/moWodBkU.shtml

相关文章

FarPoint.Win.Spread 自定义表头

软件开发技术交流,同学习共进步,欢迎加群, 群号:169600532 最近C/S项目中用到FarPoint.Win.Spread,想在表头加个全选的checkbox,实现效果如图: 列的设置大家都清楚,直接可视化视图中设置该列Ce…

关于 farpoint spread的问题。

由于万不得已,使用了 farpoint spread 控件。 版本:4.0.3509.2008 天杀,这东西在网上居然没有可以用的使用说明,欺负不会英文的我。 1.farpoint spread 单元格内增加滚动条。 虽然简单,但是如果忽略一个参数设置就会…

WPF方便的调用FarPoint

一、安装FarPoint 二、创建WPF项目 三、引用farpoint相关dll 四、引用winform的相关dll: System.Windows.Forms.dll 五、引用winfrom与WPF的窗台整合dll 所需dll截图 六、新建一个winfrom用户控件,使用farpoint创建一个表格 通过右键spread design可以直接使…

N-Gram 分词算法 Python 实现

概述 N-Gram 算法是一种单词级别的窗口取词算法,N-Gram(有时也称为N元模型)是自然语言处理中一个非常重要的概念,通常在NLP中,人们基于一定的语料库,可以利用N-Gram来预计或者评估一个句子是否合理。另外一…

ElasticSearch学习随笔之分词算法

ElasticSearch 1、ElasticSearch学习随笔之基础介绍 2、ElasticSearch学习随笔之简单操作 3、ElasticSearch学习随笔之java api 操作 4、ElasticSearch学习随笔之SpringBoot Starter 操作 5、ElasticSearch学习随笔之嵌套操作 6、ElasticSearch学习随笔之分词算法 7、ElasticS…

常用分词算法笔记

常用统计语言模型,包括了N元文法统计模型(N-gram Model)、隐马尔科夫模型(Hidden Markov Model,简称HMM)、最大熵模型(Maximum Entropy Model)。 N-Gram这是一种依赖于上下文环境的词…

NLP 中文分词-双向匹配算法(理论+Python实现)

一、理论描述 1.中文分词的概念: 是指把没有明显分界标志的字串切分为词串,包括标点符号、数字、数学符号、各种标记、人名、地名、机构名等未登录词的识别。汉语自动分词主要包括:(1)根据分词规范,建立机…

NLP ---分词详解(常见的五种分词技术二)

上一篇我们讲了N一最短路径方法、基于词的n元文法模型,本节将主要介绍由字构词方法、基于词感知机算法的汉语分词方法、基于字的生成模型和区分式模型相结合的汉语分词方法,下面我们就开始讲解由字构词的方法: 由字构词方法 由字构词方法的…

常用分词算法总结(字典、统计、神经网络)

本文转载自公众号“夕小瑶的卖萌屋”,专业带逛互联网算法圈的神操作 -----》我是传送门 关注后,回复以下口令: 回复【789】 :领取深度学习全栈手册(含NLP、CV海量综述、必刷论文解读) 回复【入群】&#xf…

分词算法----正向和逆向最大匹配算法(含Python代码实现)

文章目录 分词算法(Segmentation Method)最大匹配算法(Maximum Matching)需要的前提正向最大匹配算法(Forwards Maximum Match,FMM)逆向最大匹配算法(Reverse Maximum Match,RMM)双向最大匹配算法小结 分词算法(Segmentation Method) 在文本处理流程中&…

自然语言处理——分词算法

引言 分词是自然语言处理中的基本操作,今天我们就来看一下常用的分词算法及实现。 最大匹配算法 所谓的最大匹配指的是匹配最长的单词,通常会指定一个最大长度。根据搜索顺序的不同,主要有前向最大匹配算法、后向最大匹配算法、双向匹配算…

分词算法介绍——千里之行,始于足下

NLP(自然语言处理),对于它来说,如何有效地编码一段文本,是它首先要考虑的问题。而在编码文本之前,要先把它切割成小块,这些小块叫做 tokens,这个过程叫做分词(tokenizati…

C#分词算法

C#分词算法 分词算法的正向和逆向非常简单,设计思路可以参考这里: 中文分词入门之最大匹配法 我爱自然语言处理 http://www.52nlp.cn/maximum-matching-method-of-chinese-word-segmentation 正向最大匹配,简单来说,就是分词的时候&#xf…

windows10家庭版打开组策略

目录 一、新建文本文件,输入以下内容二、鼠标右键单击,以管理员身份运行三、验证 windows10家庭版默认没有放开组策略,可以通过以下方法添加。 一、新建文本文件,输入以下内容 echo offpushd "%~dp0"dir /b C:\Window…

【Windows】Win10家庭版启用组策略gpedit.msc

转载请注明出处,原文链接:https://blog.csdn.net/u013642500/article/details/80138799 【前言】 大家都认为,Windows 10家庭版中并不包含组策略,其实不然,它是有相关文件的,只是不让你使用而已。那么我们让…

win10(家庭版)打开本地组策略失败的处理方法

win10(家庭版)打开本地组策略失败的处理方法 1 新建TXT文件 将下列代码复制粘贴到txt中: echo off pushd “%~dp0” dir /b C:\Windows\servicing\Packages\Microsoft-Windows-GroupPolicy-ClientExtensions-Package~3*.mum >List.txt…

win10找不到组策略,解决方法

win10找不到组策略,可以用以下办法开启权限: 1.winr 唤出运行,输入notepad创建记事本; 2.输入以下代码并另存为gpedit.bat; echo offpushd "%~dp0"dir /b %systemroot%\Windows\servicing\Packages\Micros…

如何停止Monkey测试

当我们运行Monkey测试时,命令发出之后,手机便开始执行monkey命令了。Monkey命令具体用法如下图所示: 网上大部分人认为monkey开始测试之后,就不能停止,除非时间数执行完成,或者在cmd窗口执行adb reboot来进…

Android的monkey测试

Android SDK中的android调试桥(adb)shell里,有一个用于测试的工具——monkey。不知道最早monkey这个名字的来历,不过他确实如同一只调皮的猴子,在android app里各种乱按、乱晃、乱摸。 如何使用:进入命令行…

android测试-monkey测试

文章目录 前言一、为什么Monkey测试二、什么是Monkey测试三、如何做monkey测试 前言 Monkey 测试是通过向系统发送伪随机的用户事件流(如按键输入、触摸屏输入、手势输入等),实现对应用程序客户端的稳定性测试; 通俗来说&#xf…