面试官:什么是数据库范式?什么是反范式?有什么优缺点?
设计数据库表结构时数据库范式是我们经常考虑的策略。但往往很多时候我们会违反范式以获得更好的性能。今天来聊一聊这个话题。1.范式第一范式表中字段是原子的不可以再拆分。一个经典的例子就是地址字段记录了省市区id地址1北京市海淀区如果要符合范式可以对地址进行拆分。id省市区1北京市北京市海淀区当然这里只是为了举例说明实际项目中会使用标准的行政地区码来进行保存。第二范式首先要满足第一范式在此基础上主键以外的字段必须完全依赖主键不能依赖其他字段。比如下面的订单表订单id产品id产品数量购买价格订单金额100p201220130100p202330130订单表如果单独用“订单id”不能标记唯一记录只能使用“订单id产品id”做联合主键但是订单金额这个字段跟“产品id”没有关系这就不符合第二范式。可以对订单表进行优化去除“订单金额”订单id产品id产品数量购买价格100p201220100p202330订单金额表订单id订单金额币种100130RMB查询的时候使用订单id 做 JOIN 查询。第三范式首先要满足第二范式在此基础上表中的字段不能间接依赖主键也就是需要通过依赖传递来对主键形成依赖。再看下面的订单表主键是订单id订单id用户id用户姓名100C10tom101C11json用户姓名不能直接依赖主键“订单id”而是通过“用户id”间接依赖的这就不符合第三范式。可以拆分出用户表查询的时候使用用户id 进行 JOIN。 订单表订单id用户id100C10101C11用户表用户id用户姓名C10tomC11jsonBCNF 范式也称 BC 范式它是在满足第三范式的基础上不允许一个表中存在两个可以做主键的字段。比如下面这个仓库表仓库id管理员id存储商品id存储商品数量S100M10P200200S100M10P300230如果一个仓库只能由一个管理员管理而一个管理员也只能管理一个仓库那主键可以选择{仓库id存储商品id}也可以选择{管理员id存储商品id}。这就不符合 BCNF 范式。 可以把上表拆分出两个表仓库管理表仓库id管理员idS100M10S100M10仓库表仓库id存储商品id存储商品数量S100P200200S100P3002304NF 范式4NF 范式是在第三范式的基础上不允许表中字段由多对多的依赖。比如下面这个表符合第三范式但是订单id 和产品id 存在多对多的关系。订单id产品id产品名称100p201产品1100p202产品2可以拆分成三个表订单产品关系表订单id产品id100p201100p202订单表订单id订单金额100130产品表产品id产品名称p201产品1p202产品2查询的时候做三张表的 JOIN 查询。2.优缺点从上面范式的介绍可以看出范式是数据库设计的规约主要有以下优点减少存储空间同一个实体的属性只在表中存储一次减少了数据冗余节省了存储空间写数据性能高每个属性的插入、更新通常只需要操作一张表操作的数据集小效率更高数据完整性遵守范式设计表中需要保存关联实体的主键通过主键关联来保证数据完整性。去重操作少没有冗余数据也就很少会用到类似 distinct 和 group by 这样的耗时语句。但过度遵循范式设计也会存在一些缺点查询性能受到影响查询通常需要 JOIN 多个表JOIN 的表数量较多时JOIN 语句会成为性能瓶颈SQL 语句复杂度升高多张表 JOIN 往往使查询语句可读性差遇到重构、迁移之类的工作会带来很多额外工作量对索引依赖更多为了提高 JOIN 语句性能往往需要在连接字段上建立索引。因为遵循范式可能存在的缺点在实际设计和开发中我们往往会引入反范式通过增加数据冗余将不遵循范式但是需要的字段放到一个表中通过增加冗余来避免复杂的 JOIN通过对冗余字段增加索引来提高查询效率。核心思想也是时间换空间。反范式带来的优点是简化查询语句提高 SQL 执行效率对并发读的场景更加合适。但在写多的场景下也会存在一些问题比如因为要写多张表增删改操作更复杂 很容易造成锁竞争降低写入性能。同时也更容易导致数据不一致维护难度增加。3.使用建议在我们的实际项目开发中一般都使用混合范式。对 OLTP联机事务处理类型的使用场景比如电商、ERP 等写入比较多的系统可以考虑使用范式设计。而对于 OLAP联机分析处理的使用场景比如报表、数仓等需要处理复杂查询都是读取操作可以考虑采用反范式设计。通常使用 ELT 工具把业务数据从关系型数据库抽取到湖仓在湖仓构建反范式化的数据模型用于业务数据查询和报表生成。

相关新闻

自动驾驶硬件在环(HIL)平台:从教学验证到量产算法移植

自动驾驶硬件在环(HIL)平台:从教学验证到量产算法移植

简介:本资源是一篇发表于《实验技术与管理》2021年第2期的核心期刊论文,聚焦自动驾驶汽车硬件在环(AVHIL)仿真实验平台的研发实践,面向高校自动化、车辆工程及人工智能相关专业本科生与研究生,解决教学中缺…

2026/10/10 12:12:48 阅读更多 →
Android资源加载全流程解读:从R类到resources.arsc的运行机制与排查指南

Android资源加载全流程解读:从R类到resources.arsc的运行机制与排查指南

Android技术圈里很少有人系统地把“资源加载”这条链路讲透。开发者天天跟R.drawable.xxx、getString()、Resource打交道,但真要遇到“资源找不到”“混淆后ID错乱”“动态加载插件资源失效”“多语言不生效”这类问题,能立刻定位到根因的人并不多。这篇…

2026/10/10 12:12:47 阅读更多 →
C# Winform MQTT客户端实例:从连接订阅到断线重连的完整指南

C# Winform MQTT客户端实例:从连接订阅到断线重连的完整指南

简介:这是一套面向C#开发者的WinForm MQTT客户端完整实例,特别适合需要在Windows桌面应用中接入物联网消息通信的项目参考。实例源码演示了从建立TCP连接、发送连接请求、订阅主题到接收并处理消息的完整调用链,同时搭配WinForm图形界面让配置…

2026/10/10 12:11:46 阅读更多 →

最新新闻

Linux history命令完全指南:用法、原理与安全审计

Linux history命令完全指南:用法、原理与安全审计

1. 从history开始:为什么每一个Linux用户都该掌握它凡是跟Linux打过交道的人,几乎没有不知道history命令的。但绝大多数人只是把它当成"查看之前敲过的命令"的临时工具,用一下就结束了。真正做运维时间长了你会发现,his…

2026/10/10 15:20:40 阅读更多 →
72GB权重四模态跑通:Jev-Omni本地部署的坑我都替你踩完了

72GB权重四模态跑通:Jev-Omni本地部署的坑我都替你踩完了

72GB权重四模态跑通:Jev-Omni本地部署的坑我都替你踩完了 【免费下载链接】Jev-Omni 项目地址: https://ai.gitcode.com/hf_mirrors/akhilaaa3/Jev-Omni 一个 12B 参数的多模态模型,输入文本、图像、音频甚至视频,不吐一个字&#xf…

2026/10/10 15:20:40 阅读更多 →
目标模拟试验框架:用观察性数据逼近RCT因果结论

目标模拟试验框架:用观察性数据逼近RCT因果结论

顶级期刊给一篇方法学框架单独发文章,这种事在真实世界研究圈子里不常见。前段时间看到四川大学团队在JAMA子刊发表的目标模拟试验(Target Trial Emulation,下称TTE)研究设计与实施框架,核心逻辑其实很朴素&#xff1a…

2026/10/10 15:20:40 阅读更多 →
C++模板编译期循环展开:从递归到折叠表达式的实战指南

C++模板编译期循环展开:从递归到折叠表达式的实战指南

写 C 高性能代码,最烦的就是同一段循环在不同编译器和优化选项下给你生成完全不同的汇编。你明明想让 8 次、16 次、32 次固定迭代老老实实摊开,编译器却可能缩成一个有进位、有计数器、有跳转的运行时循环;反过来,你想让编译器自…

2026/10/10 15:20:40 阅读更多 →
cls_threshold 一调就灵?GLiNER2.5-Decide 多标签分类的精度/召回跷跷板

cls_threshold 一调就灵?GLiNER2.5-Decide 多标签分类的精度/召回跷跷板

cls_threshold 一调就灵?GLiNER2.5-Decide 多标签分类的精度/召回跷跷板 【免费下载链接】GLiNER2.5-Decide 项目地址: https://ai.gitcode.com/hf_mirrors/fastino/GLiNER2.5-Decide 在多标签分类任务里,GLiNER2.5-Decide(340M 参数…

2026/10/10 15:20:39 阅读更多 →
网页消息提醒音JS落地指南:自动播放解锁与实战避坑

网页消息提醒音JS落地指南:自动播放解锁与实战避坑

简介:网页消息提醒音js是一份面向网页前端开发者的实用示例资源,主要解决页面在收到新消息或事件时准确播放提示音的问题,适合在实时通讯、社交网络、在线协作等需要即时感知的场景中使用。资源压缩包共包含3个文件,有可直接运行的…

2026/10/10 15:19:38 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 11:14:25 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 1:36:08 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 11:14:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 10:38:42 阅读更多 →