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

说一说关系数据库中的范式建模

面试中可能会被问到,来回顾总结一下,参考《数据库系统第五版》(王珊/萨师煊)

范式(normal form),我的理解是用来规范关系数据库中实体如何划分以及实体间如何建立联系来保持数据完整性的一种指导思想,目的就是要消除数据冗余,追求单表操作,修改某个实体只需要操作一张表,实体与实体间修改互不影响。目前存在六种范式:1NF/2NF/3NF/BCNF/4NF/5NF,它们之间属于层层递进的关系。日常业务中满足3NF就可以了,因为更高的范式意味着更多层表的拆分,那么在操作时也就会产生更多的表关联,同样会拉低性能。

1NF

1NF用来保证属性的原子性。也就是属性不可再分。什么是原子性,我的理解是没有绝对的原子性,具体需要结合业务来设计。比如对于地址这个属性,如果业务中这个属性只是为了简单的对地址做个记录,我们可以直接设计成类似xx省xx市xx县”,而如果在以后的业务中可能会发生针对于市县的操作,那就需要对地址进行到市县的分解。1NF是关系型数据库的基础,不满足1NF就不是一个关系型数据库。

2NF

2NF的目的是消除部分依赖。指的是表中所有除主键外的属性都能由这个主键唯一确定,不能由这个主键中的部分字段确定。举个例子,有学生成绩表(学号,课程,姓名,成绩),这个成绩表中主键是(学号,课程),(学号,课程)作为主键时可以确定成绩。而对于姓名这个属性,只根据学号就可以确定。这里,就存在姓名对主键(学号,课程)的部分依赖。从这个例子可以看出,如果一个表存在部分依赖其实说明了这个表中至少存储了两种实体的数据,在这个例子中存储了成绩实体和学生实体的数据。

3NF

3NF用来消除传递依赖。直白说就是表中所有主键外的属性都得与主键直接相关,而不能是间接相关。比如有学生信息表(学号,姓名,院系,院系主任),其中主键为学号,根据学号可以确定院系,根据院系可以确定院系主任,这里就说存在院系主任对学号的传递依赖。其实这里还是说明一个表中如果存在传递依赖,也至少存储了两个实体类型的数据。个人觉得二范式和三范式的目的都是为了保证一张表只存储一种实体数据,减少数据冗余,保证数据的完整性。区别在于分表的过程,2NF是以复合主键中的主属性来建立两个实体之间的联系,保证实体完整性。而3NF是通过外键的形式建立两个实体之间的联系,保证参照完整性。

遵守3NF建模的好处

从上面可以看到,如果表的设计不满足2NF或3NF,那么就会存在一个表中包含多个实体属性的问题,造成数据冗余,这种数据冗余一方面导致数据修改复杂,另一方面可能会导致数据插入或删除时引起业务逻辑上的错误。

比如说对于2NF中的那个成绩表(学号,课程,姓名,成绩),一个学生每选一门课,他的姓名就会被存储一次,如果说某天这个学生改名了,那么所有他选过的课程记录都要被修改,不仅效率低,也容易漏改出错,这表现了修改复杂。再比如说,这个学生还没选课,那么就会因为缺少主键而保存不了学生实体的信息,这里存在插入异常。或者说是,这个学生开始选了2门课,后来因为不喜欢不选了,当这个学生所有的选课记录都被删除后,那么这个学生实体的信息也丢失了,这里就表现出删除异常。

实际业务中怎么遵守3NF建模

这里引用网上看到的一段话,觉得很精炼简洁:

怎么做到第三范式? 不需要考虑第三范式的定义。按对象划分就好了,学生的属性归学生,系的属性归系,教师的属性归教师,学校的属性归学校。

相关文章:

说一说关系数据库中的范式建模

面试中可能会被问到,来回顾总结一下,参考《数据库系统第五版》(王珊/萨师煊) 范式(normal form),我的理解是用来规范关系数据库中实体如何划分以及实体间如何建立联系来保持数据完整性的一种指导思想,目的就…...

Mysql是怎样运行的之Inno页介绍

一、InnoDB介绍 InnoDB是一个将表中的数据存储到磁盘上的存储引擎,所以即使关机后重启我们的数据还是存在的。而真正处理数据的过程是发生在内存中的,所以需要把磁盘中的数据加载到内存中,如果是处理写入或修改请求的话,还需要把内…...

【华为OD机试模拟题】用 C++ 实现 - 找字符(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 货币单位换算(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - 选座位(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - 停车场最大距离(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - 重组字符串(2023.Q1) 【华为OD机试模…...

JAVA 8 新特性 Lamdba表达式

Java8 新特性: 1、Lamdba表达式 2、函数式接口 3、方法引用和构造引用 4、Stream API 5、接口中的默认方法和静态方法 6、新时间日期API 7、Optional 8、其他特性 Java8 优势:速度快、代码更少(增加了新的语法 Lambda 表达式)、强…...

使用antlr实现一个简单的表达式解析

背景 之前在做游戏的过程中,我们经常需要解析一些公式,比如(对方攻击值-对方防御值)*2这种表达式,我们习惯于用代码写死公式,但是这种方式不够灵活,我们想要的是一种灵活的解析方式, 只需要策划输入一个任…...

2月24日作业

题目:通过操作Cortex-A7核,串口输入相应的命令,控制LED灯进行工作--->上传CSDN 1.例如在串口输入led1on,开饭led1灯点亮 2.例如在串口输入led1off,开饭led1灯熄灭 3.例如在串口输入led2on,开饭led2灯点亮 4.例如在串口输入led2off,开饭led…...

SpringBoot可以同时处理多少请求?

本文已收录至我的Github仓库DayDayUP:github.com/RobodLee/DayDayUP,欢迎Star ⭐⭐⭐⭐⭐转载请注明出处:https://blog.csdn.net/weixin_43461520/article/details/129207427 前言 前两天面试的时候,面试官问我:一个i…...

代码随想录【Day23】| 669. 修剪二叉搜索树、108. 将有序数组转换为二叉搜索树、538. 把二叉搜索树转换为累加树

669. 修剪二叉搜索树 题目链接 题目描述: 给定一个二叉搜索树,同时给定最小边界L 和最大边界 R。通过修剪二叉搜索树,使得所有节点的值在[L, R]中 (R>L) 。你可能需要改变树的根节点,所以结果应当返回修剪好的二叉搜索树的新…...

Wsl2 ubuntu 配置git 阿里云codeup

目录 创建一个跟你windows git使用相同的用户名,特别重要 配置git 用户名和邮箱 配置阿里云codeup 拉取仓库提示文件权限问题 给用户目录权限 配置项目文件别名 key_load_public: invalid format 怎么办? WSL ubuntu sshd: no hostkeys available -- exiting…...

展会邀约 | 昂视与您相约BTF第12届上海锂电展

BTF第12届上海国际新能源锂电展将于3月7日在上海新国际博览中心举办。此次展会以“锂想动力,共创未来”为主题,汇聚行业内一众翘楚企业与专业观众,为各位展商以及观众提供专业的锂电交流平台,了解与碰撞新产品、新技术与解决方案&…...

RK3568平台开发系列讲解(驱动基础篇)中断子系统框架

🚀返回专栏总目录 文章目录 一、中断硬件的组成二、软件框架三、中断常见概念沉淀、分享、成长,让自己和他人都能有所收获!😄 📢中断是指 CPU 正常运行期间,由于内外部事件或程序预先安排的事件,引起的 CPU 暂时停止正在运行的程序, 转而为该内部或外部预先安排的事…...

消费复苏迎“春”暖,服装行业如何开启“狂飙”模式?

2023年开年前2个月,全国多地消费市场的“热度”一直在持续上涨,商场、餐馆、娱乐场所等消费市场人气旺盛,消费复苏的“暖”意十足,一幕幕“忙”起来、“热”起来的场景,让各行各业的商家都对未来充满了期待与信心。在消…...

Springboot 整合Flowable工作流框架搭建

我们在开发自动化办公软件时经常会遇到各种审批流程功能,这个使用就需要使用到工作流引擎。目前主流的工作流引擎有Activiti、Flowable、camunda,其中Flowable是在Activiti的基础上开发出来的,基于BPMN2.0协议,它包括 BPMN&#x…...

ASE0510SH-ASEMI的MOS管ASE0510SH

编辑-Z ASE0510SH在SOT-89封装里的静态漏极源导通电阻(RDS(ON))为140mΩ,是一款N沟道中低压MOS管。ASE0510SH的最大脉冲正向电流ISM为15A,零栅极电压漏极电流(IDSS)为1uA,其工作时耐温度范围为-55~150摄氏度。ASE0510…...

Golang学习Day2

Go语言中的函数go语言中函数特性go语言有三种函数:普通函数、匿名函数(没有名称的函数)方法(定义在struct上的函数)。receivergo语言中不运算函数重载(overload),也就是说不允许函数…...

Android 中malloc_debug 原理详解

版本基于:Android R 0. 前言 最近上项目中遇到一个native 可能内存泄漏的问题,曾考虑使用HWASAN,但这个工具是针对整个系统,运行代价还是很高的。而笔者遇到的问题大致有所方向,能指定到某一个进程,针对单…...

D. Triangle Coloring【组合数学,乘法逆元】

链接 分析 题目要求我们去求出最优的染色的方法数。首先什么时候是最优的,这里只有两种颜色,不可能取到三条边,即蓝色为B,红色为R,有BBB,RRR,BBR,RRB四种组合,显然最多的就是取两条边,我们想取到…...

【读论文】AttentionFGAN

【读论文】AttentionFGAN介绍网络架构提取红外图像目标信息的网络辨别器损失函数生成器损失函数辨别器损失函数总结参考论文: https://ieeexplore.ieee.org/document/9103116/如有侵权请联系博主介绍 好久没有读过使用GAN来实现图像融合的论文了,正好看…...

ClickHouse 配置文件使用说明

本文主要介绍 ClickHouse 的配置文件。在 ClickHouse 中配置主要分为两类,一类是负责 server 端配置的,另一类是负责用户端配置的。负责 server 端配置的一般会放在 config.xml 文件中,负责用户端配置的一般会放在 users.xml 文件中。当然如果…...

如果不是互联网人,谁会找到这些神器?

一、上线啦 你肯定该问了,这个是什么鬼东西。它本来是一个创建自己网站的网站。 现在使用它可以创建自己的小程序,又不是有点小厉害了。 而且功能强大,还支持微信支付,分销,优惠券,营销等多种功能。 还有多…...

保姆级教程:在Ubuntu 22.04上配置VNC Server,并用VNC Viewer远程桌面(解决加密报错)

深度解析Ubuntu 22.04 VNC远程桌面配置与加密协议调优实战 在分布式开发和远程协作成为主流的今天,掌握高效的远程桌面技术已成为开发者和运维人员的必备技能。Ubuntu作为最受欢迎的Linux发行版之一,其内置的VNC服务为远程访问提供了原生支持&#xff0c…...

用Python手把手复现NRBO优化算法:从数学公式到完整代码的保姆级教程

用Python手把手复现NRBO优化算法:从数学公式到完整代码的保姆级教程 优化算法在工程和科学计算中扮演着关键角色,而牛顿-拉弗森优化算法(NRBO)作为最新提出的智能优化方法,凭借其高效的收敛性能引起了广泛关注。本文将彻底拆解NRBO的核心机制…...

MCGS组态软件连接Modbus TCP设备?别急,先搞懂网关的这5种工作模式怎么选

MCGS组态软件连接Modbus TCP设备:网关工作模式深度解析与选型指南 在工业自动化系统中,MCGS组态软件与Modbus TCP设备的稳定通信是数据采集与控制的基础环节。ZLAN5143D作为一款多功能工业网关,其五种工作模式的选择直接影响系统响应速度、数…...

高等数学 定理及习题

本文涉及知识点 数学 《高等数学》(上册) 第一章 函数与极限 第一节 映射与函数 第二节 数列的极限 第三节 函数的极限 第四节 无穷小与无穷大 第五节 极限运算法则 第六节 极限存在准则 两个重要极限 第七节 无穷小的比较 第八节 函数的连续性…...

数据库局部变量,全局变量,流程控制

前言知识点什么时候用?局部变量调试脚本、存储过程参数、临时存值全局变量获取执行状态、错误处理IF/WHILE条件判断、批量数据处理视图简化复杂查询、统一查询逻辑索引加快查询速度函数封装可复用的计算逻辑存储过程封装复杂业务、批量操作一SQL局部变量变量1.是什么…...

Agentic o3调度器与Gemma/Nemotron-H推理范式演进

1. 项目概述:一场悄然发生的模型推理范式迁移最近在几个核心AI工程团队的内部技术简报里,反复看到一个代号“TAI#149”的专项分析报告被高频引用——它不是某家公司的新品发布会通稿,而是一份由一线模型部署工程师自发整理、持续迭代的实战观…...

ops-math:昇腾 NPU 的数学算子库

ops-math:昇腾 NPU 的数学算子库 之前帮朋友看一个数学密集型模型(做科学计算的,不是 AI 模型)的适配代码,发现他自己手写了很多数学函数(Sin/Cos/Exp/Log 等)——在 NPU 上跑,性能只…...

Maven依赖scope:从编译到打包,一张图理清生命周期与classpath

Maven依赖scope全解析&#xff1a;构建生命周期与classpath的精准控制 当你盯着pom.xml里那些<scope>compile</scope>标签时&#xff0c;是否曾好奇它们究竟如何影响你的构建流程&#xff1f;Maven的依赖scope就像一个个精密的开关&#xff0c;控制着依赖项在编译、…...

asc-devkit:昇腾算子开发调试工具完全指南

前言 第一次写Ascend C算子&#xff0c;跑出来性能只有官方的30%&#xff0c;不知道慢在哪。后来发现了asc-devkit这个工具集&#xff0c;里面有性能分析、调试、benchmark三件套&#xff0c;一把就把瓶颈查出来了——是tiling参数设太大&#xff0c;Local Memory溢出&#xf…...

2026年,写给所有还在迷茫的技术人:你的坚持终将闪耀

站在2026年的节点回望&#xff0c;整个互联网行业的寒潮似乎还没完全退去&#xff0c;AI大模型重构业务逻辑的浪潮又拍在了每个技术人的岸边。尤其是对千万软件测试从业者来说&#xff0c;这种迷茫感来得更加具体&#xff1a;手工测试岗位不断被自动化脚本挤压&#xff0c;纯功…...