当前位置: 首页 > 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 文件中。当然如果…...

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

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

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...

《基于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…...

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

【Java学习笔记】BigInteger 和 BigDecimal 类

BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

排序算法总结(C++)

目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...

深度剖析 DeepSeek 开源模型部署与应用:策略、权衡与未来走向

在人工智能技术呈指数级发展的当下,大模型已然成为推动各行业变革的核心驱动力。DeepSeek 开源模型以其卓越的性能和灵活的开源特性,吸引了众多企业与开发者的目光。如何高效且合理地部署与运用 DeepSeek 模型,成为释放其巨大潜力的关键所在&…...

Linux 下 DMA 内存映射浅析

序 系统 I/O 设备驱动程序通常调用其特定子系统的接口为 DMA 分配内存,但最终会调到 DMA 子系统的dma_alloc_coherent()/dma_alloc_attrs() 等接口。 关于 dma_alloc_coherent 接口详细的代码讲解、调用流程,可以参考这篇文章,我觉得写的非常…...