数据库三范式(1NF、2NF、3NF)
1NF(第一范式)
定义:确保每一列都是原子值,即是不可分割的基础数据项。
所谓第一范式(1NF)是指在关系模型中,对于添加列的一个规范要求,所有的列都
应该是原子性的,即数据库表的每一列都是不可分割的原子数据项,而不能是集合,
数组,记录等非原子数据项。即实体中的某个属性有多个值时,必须拆分为不同的属
性。在符合第一范式(1NF)表中的每个域值只能是实体的一个属性或一个属性的一
部分。简而言之,第一范式就是无重复的域。
比如地址,我们可以存为辽宁省大连市甘井子区。那么这样其实就不满足,因为我们
把省市区放在一起存储了。我们将地址进行拆分存储即可。省,市,区。这样满足
第一范式。
2NF(第二范式)
定义:在满足1NF的基础上,消除非主键字段对主键字段的部分(函数)依赖。
部分函数依赖是指在一个关系表中,非主属性(即非主键字段)依赖于主键的一部分,而不是整个主键。在第二范式(2NF)中,要求非主属性必须完全依赖于主键,这意味着非主属性不能只依赖于主键的一部分。
第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。
部分函数依赖的例子:
假设Student表的结构如下:
| 学生编号 | 学生姓名 | 班级编号 | 院系 | 课程编号 | 成绩 |
|---|---|---|---|---|---|
| S01 | 杨明 | D01 | 思齐 | C01 | 90 |
| S02 | 李婉 | D01 | 思齐 | C01 | 87 |
| S01 | 杨明 | D01 | 思齐 | C02 | 92 |
| S03 | 刘海 | D02 | 述圣 | C01 | 95 |
| S04 | 安然 | D02 | 述圣 | C02 | 78 |
| S05 | 乐天 | D03 | 省身 | C01 | 82 |
复合主键是指由多个字段组合起来,共同作为表的主键,这些字段的组合值必须是唯一的,用来唯一标识表中的每条记录。
学生编号是作为识别学生的唯一标识,我们可以假设它是主键。但是,如果我们考虑到成绩是针对每个学生编号和课程编号组合的,那么在这个特定场景下,学生编号和课程编号一起构成了复合主键,因为只有这两个字段的组合才能唯一确定一条记录。
部分函数依赖的情况是指在一个复合主键的情况下,非主属性依赖于主键的一部分。例如,如果学生姓名、班级编号和院系只依赖于学生编号而不依赖于课程编号,那么这些非主属性就对复合主键(学生编号,课程编号)存在部分函数依赖。
为了消除这种部分函数依赖,我们可以将表拆分成两个:
- 学生基本信息表(只包含学生编号、学生姓名、班级编号和院系):
| 学生编号 | 学生姓名 | 班级编号 | 院系 |
|---|---|---|---|
| S01 | 杨明 | D01 | 思齐 |
| S02 | 李婉 | D01 | 思齐 |
| S03 | 刘海 | D02 | 述圣 |
| S04 | 安然 | D02 | 述圣 |
| S05 | 乐天 | D03 | 省身 |
- 学生成绩表(包含学生编号、课程编号和成绩):
| 学生编号 | 课程编号 | 成绩 |
|---|---|---|
| S01 | C01 | 90 |
| S02 | C01 | 87 |
| S01 | C02 | 92 |
| S03 | C01 | 95 |
| S04 | C02 | 78 |
| S05 | C01 | 82 |
这样,每个表的非主属性都完全依赖于其主键,满足了第二范式(2NF)。
3NF(第三范式)
定义:在满足2NF的基础上,消除非主键字段对主键的传递依赖。
第三范式(3NF):第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。
在2NF基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)
举例说明:

上表中,所有属性都完全依赖于学号,所以满足第二范式,但是“班主任性别”和“班主任年龄”直接依赖的是“班主任姓名”,
而不是主键“学号”,所以需做如下调整:


这样以来,就满足了第三范式的要求。
不过现在业务上的表设计基本都是反范式的。当然不是说完全不遵守范式,而是适当的进行调整。
比如业务上经常需要余字段,减少联表查询,提升性能,特别是业务量比较大的公司,这种冗余是很有必要的!
相关文章:
数据库三范式(1NF、2NF、3NF)
1NF(第一范式) 定义:确保每一列都是原子值,即是不可分割的基础数据项。 所谓第一范式(1NF)是指在关系模型中,对于添加列的一个规范要求,所有的列都 应该是原子性的,即数…...
C语言_数据结构_顺序表
1. 本章重点 顺序表初始化顺序表尾插顺序表尾删顺序表头插顺序表头删顺序表查找顺序表在pos位置插入x顺序表删除pos位置的值顺序表销毁顺序表打印 2. 顺序表的概念及结构 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储…...
Llama 3.2 Vision Molmo:多模态开源生态系统基础
编者按: 视觉功能的融入对模型能力和推理方式的影响如何?当我们需要一个既能看懂图像、又能生成文本的 AI 助手时,是否只能依赖于 GPT-4V 这样的闭源解决方案? 我们今天为大家分享的这篇文章,作者的核心观点是…...
【数据结构与算法】第6课—数据结构之栈
文章目录 1. 栈2. 栈的初始化和栈的销毁3. 入栈和出栈(压栈)4. 取栈顶元素并打印5. 栈的练习题5.1 有效的括号 1. 栈 栈:也是一种线性表,其数据结构与动态顺序表的数据结构类似栈分为栈顶和栈底,在栈中,插入…...
开源全站第一个Nextron(NextJS+electron)项目--NextTalk:一款集成chatgpt的实时聊天工具
NextTalk 简介 该项目是一个基于Nextron(NextJSElectron)的桌面端实时聊天工具。 但由于使用了NextJS中的ssr及api route功能,该程序只能在开发环境运行。 关于生产版本:我将其网页端部分分离,并用Pake将其打包成桌面端,生产体…...
多样化的编程模型:并发与并行策略
因为经常看着某些框架设计的编程模型很晕,所以自己梳理总结了一下编程模型的分类,总共六个大类,基本所有常见框架设计的编程模型都是基于这六个大类来实现的,如果有错误的地方,请见谅并不吝赐教,感谢&#…...
npm入门教程2:npm历史
一、起源与诞生 时间背景:npm的诞生与Node.js的兴起紧密相关。Node.js是一个基于Chrome V8引擎的JavaScript运行环境,它允许JavaScript代码在服务器端运行。随着Node.js的流行,开发者们对于包管理和依赖解决的需求日益增长。诞生:…...
Cuebric:用AI重新定义3D创作的未来
一、简介 Cuebric 是一家成立于2022年夏天的好莱坞创新公司,致力于为电影、电视、游戏和时尚等行业提供先进的AI多模态SaaS平台。自2024年1月正式推出以来,Cuebric 已经在市场上获得了广泛的认可和积极的反馈。目前,该平台正处于1.0版本的beta测试阶段,已募集约50万美元的…...
前端react常见面试题目(basic)
1. 如果 React 组件的属性没有传值,它的默认值是什么? 如果一个 React 组件的属性(props)没有传值,那么它的默认值会是 undefined。你可以通过组件内部的逻辑来设置默认值,比如使用逻辑运算符或者 ES6 的默认参数。 …...
机器人技术基础(4章逆运动解算和雅克比矩阵)
逆运动解算: 雅克比矩阵: 将动力学分析转向运动的物体 下图中的 n o y 反映了机器人的姿态矩阵, 最后一列 p 反应了机器人在空间中的位置:...
OpenGL入门002——顶点着色器和片段着色器
文章目录 一些概念坐标转换阶段顶点着色器片段着色器VBOVAO 实战简介main.cppCMakeLists.txt最终效果 一些概念 坐标转换阶段 概述: 模型空间、世界空间、视图空间和裁剪空间是对象在3D场景中经历的不同坐标变换阶段。每个空间对应渲染管道的一个步骤,…...
[数组排序] LCR 164. 破解闯关密码
文章目录 1. 题目链接2. 题目大意3. 示例4. 解题思路5. 参考代码 1. 题目链接 LCR 164. 破解闯关密码 - 力扣(LeetCode) 2. 题目大意 描述:给定一个非负整数数组 nums。 要求:将数组中的数字拼接起来排成一个数,打印…...
05 Django 框架模型介绍(一)
文章目录 1、Django 模型简介2、Django 中创建并使用模型(1)新加一个名为 myapp 的应用(2)定义模型类(2)激活模型类(3)创建数据库迁移文件(4)应用迁移文件 3、…...
【简道云 -注册/登录安全分析报告】
前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞…...
【C++题解】1970. 判断是什么字符
欢迎关注本专栏《C从零基础到信奥赛入门级(CSP-J)》 问题:1970. 判断是什么字符 类型:字符串、字符型 题目描述: 从键盘读入一个字符,有可能是大写字母、小写字母、数字中的一种,请编程判断&…...
Python自动化操作Word文档详解
在日常办公和数据处理中,我们经常需要处理Word文档。手动操作Word文档可能会非常繁琐和耗时,而使用Python可以实现自动化操作,提高工作效率。本文将详细介绍如何使用Python自动化操作Word文档,包括读取、写入、修改和格式化等操作…...
常用滤波算法(二)-中位值滤波法
文章目录 一、中位值滤波法简介二、C语言实现中位值滤波法三、程序说明信号初始化:滤波窗口大小:内存分配:中位值滤波函数:中位值计算函数:内存释放: 四、总结 中位值滤波法,作为一种非线性滤波…...
HCIP--以太网交换安全(总实验)
实验背景 假如你是公司的网络管理员,为了提高公司网络安全性,你决定在接入交换机部署一些安全技术:端口隔、端口安全、DHCP snooping、IPSG。 实验拓扑图 实验的要求: 1.在R1、R2连接在GE0/0/1和GE0/0/2接口下,均划…...
C语言 | Leetcode C语言题解之第519题随机翻转矩阵
题目: 题解: typedef struct {unsigned long long val;UT_hash_handle hh; } Hash;typedef struct {Hash *hash;int n_rows;int n_cols; } Solution, SL;Solution* solutionCreate(int n_rows, int n_cols) {SL *obj malloc(sizeof(SL));obj->hash …...
《机器人SLAM导航核心技术与实战》第1季:第10章_其他SLAM系统
视频讲解 【第1季】10.第10章_其他SLAM系统-视频讲解 【第1季】10.1.第10章_其他SLAM系统_RTABMAP算法-视频讲解 【第1季】10.2.第10章_其他SLAM系统_VINS算法-视频讲解 【第1季】10.3.第10章_其他SLAM系统_机器学习与SLAM-视频讲解 第1季:第10章_其他SLAM系统 …...
零基础入门esp32开发:用快马平台生成第一个led控制程序详解
最近在学ESP32开发,发现对于新手来说,从零开始写代码还是挺有挑战的。不过我发现了一个超好用的工具——InsCode(快马)平台,它可以根据你的需求直接生成可运行的代码,特别适合像我这样的初学者。 项目需求分析 我想实现一个简单的…...
Unity引擎开发过的VR大场景项目有哪些?用到的网络技术,资源处理及热更新方案有哪些
我梳理了Unity引擎开发的VR大场景代表性项目,并从网络技术、资源处理、热更新方案三个核心技术维度进行了详细分析。一、代表性VR大场景项目 1. 基于VR的数字孪生智慧城市平台 开发方:香港理工大学温州技术创新研究院技术特点:整合GIS地理信息…...
Dify知识库创建全攻略:从零开始搭建你的AI问答系统(附分段模式详解)
Dify知识库创建全攻略:从零开始搭建你的AI问答系统(附分段模式详解) 在AI技术快速渗透各行各业的今天,构建专属知识库已成为企业智能化转型的核心基础设施。Dify作为一款开箱即用的AI应用开发平台,其知识库功能尤其适合…...
uniApp离线打包实战避坑指南
1. 离线打包前的环境准备 第一次接触uniApp离线打包时,我踩过的第一个坑就是环境配置。当时以为只要安装了Android Studio就能万事大吉,结果编译时各种报错接踵而至。后来才发现,离线打包对开发环境的版本匹配要求极为严格,差一个…...
智能汽车远程诊断怎么玩?深入聊聊DoIP协议里的那些‘暗号’:VIN、EID、激活线与安全
智能汽车远程诊断的通信密码:DoIP协议中的VIN、EID与安全设计解析 当你的爱车亮起故障灯时,4S店技师只需轻点平板电脑,就能远程读取车辆状态——这背后是车载以太网诊断协议(DoIP)在发挥作用。不同于传统CAN总线诊断,基于IP网络的…...
s2-pro效果惊艳展示:情感化语音合成——喜悦、平静、关切语调
s2-pro效果惊艳展示:情感化语音合成——喜悦、平静、关切语调 1. 专业级语音合成新标杆 s2-pro作为Fish Audio开源的专业级语音合成模型镜像,正在重新定义文本转语音的技术边界。不同于传统单调的语音合成,这款工具能够精准捕捉并复现人类语…...
Android开发职位深度解析与面试指南
引言 Android开发作为移动应用开发的核心领域,近年来随着智能手机的普及和技术的迭代,已成为IT行业的热门职业方向。本文基于一份典型的Android开发职位描述展开,深入探讨其核心技能要求、经验门槛、工具使用等关键要素。职位描述强调了对Flutter、多线程、Framework、Andr…...
大模型“预训练”是怎么回事
经常在想,大模型是怎么学会“理解和生成语言”的。仔细看,它的训练过程其实很有规律,简单讲可以拆解成几个步骤。数据准备 训练大模型之前,最重要的是数据。我看到的做法是从各种网络资源收集海量文本,比如网页、书籍、…...
OpenClaw安全加固指南:nanobot镜像的防火墙与权限配置
OpenClaw安全加固指南:nanobot镜像的防火墙与权限配置 1. 为什么需要安全加固? 当我第一次在本地部署OpenClaw时,最让我忐忑不安的就是安全问题。这个能操控我鼠标键盘、读写文件的AI助手,会不会不小心删掉我的重要文档…...
Keepalived+Nginx+Tomcat 高可用项目集成 MySQL 数据库全记录
前言在之前的文章中,我搭建了基于 KeepalivedNginxTomcat 的高可用 Web 架构,实现了入口 VIP 漂移和反向代理。但这套架构还缺少“数据层”——所有服务都是无状态的,不能持久化数据。为了让项目更完整,我决定加入 MySQL 数据库&a…...
