一文详解数据库范式

news2024/11/25 7:02:02

背景

        在开发中,我们经常需要考虑如何设计合适的表结构,而则往往需要考虑数据库的范式。数据库的三范式(3NF)是数据库设计过程中用来减少数据冗余提高数据一致性的重要规则。它们分别是第一范式(1NF)、第二范式(2NF)和第三范式(3NF)。

范式

第一范式(1NF)

定义:一个表满足第一范式,如果其所有字段的值都是原子的(不可再分),且每列的值都属于同一数据类型。

目的:确保每个字段都是最小的数据单位,避免数据冗余和更新异常。

第二范式(2NF)

定义:一个表满足第二范式,如果它首先满足第一范式,且表中的所有非主键列完全依赖于主键,而不是部分依赖。

目的:消除部分依赖,即非主键字段不能依赖于主键的一部分。

示例

  • 不满足 2NF 的表:

    学生ID | 课程    | 教师
    --------|---------|------
    1      | 数学   | 张老师
    1      | 物理   | 李老师
    2      | 化学   | 王老师
    

    在这个表中,教师只依赖于课程,而不依赖于整个主键学生ID课程的组合。

  • 满足 2NF 的表:

    1. 学生表:
    学生ID | 姓名
    --------|--------
    1      | 张三
    2      | 李四
    
    1. 课程表:
    课程    | 教师
    --------|------
    数学   | 张老师
    物理   | 李老师
    化学   | 王老师
    
    1. 学生课程表:
    学生ID | 课程
    --------|------
    1      | 数学
    1      | 物理
    2      | 化学

第三范式(3NF)

定义:一个表满足第三范式,如果它首先满足第二范式,且没有非主键属性传递依赖于主键。

目的:消除传递依赖,即非主键字段不能依赖于其他非主键字段。

示例

  • 不满足 3NF 的表:

    学生ID | 姓名   | 教师   | 教师办公室
    --------|--------|--------|----------
    1      | 张三   | 张老师 | 101
    1      | 张三   | 李老师 | 102
    2      | 李四   | 王老师 | 103
    

    这里,教师办公室依赖于教师,而教师又依赖于学生ID,导致传递依赖。

  • 满足 3NF 的表:

    1. 学生表:
    学生ID | 姓名
    --------|--------
    1      | 张三
    2      | 李四
    
    1. 教师表:
    教师   | 教师办公室
    ------|----------
    张老师 | 101
    李老师 | 102
    王老师 | 103
    
    1. 学生课程表:
    学生ID | 课程
    --------|------
    1      | 数学
    1      | 物理
    2      | 化学

总结  

  • 第一范式:确保数据的原子性。
  • 第二范式:消除部分依赖,确保非主键属性完全依赖于主键。
  • 第三范式:消除传递依赖,确保非主键属性之间没有依赖关系。

范式的优点和缺点

        范式化通常可以带来如下好处:

  • 范式化的更新操作通常比反范式要快
  • 当数据较好的范式化时,就只有很少或者没有重复数据,所以只需要修改更少的数据
  • 范式化的表通常更小,可以更好的放入内存里,所以执行操作会更快
  • 很少有多余的数据、意味着在检索数据时较少需要distinct 或者 group bu语句。

        范式化设计的缺点是,通常需要关联。稍微复杂一些的查询语句,在符合范式化设计上,通常可能都需要至少一次关联。这不但代价昂贵,也可能使一些索引策略失效。例如,范式化可能将列分布在不同的表中,而这些列如果在同一个表中,本可以属于同一个索引。

反范式的优点和缺点

        反范式化可能带来如下好处:

  • 反范式由于所有数据都在一张表中,可以避免表关联
  • 单独的一张表可以使用更有效的索引策略(示例如下:)

混用范式化和反范式

        既然范式化和反范式化各有优劣,那我们又该如何选择呢?

        需要注意的是,范式化和反范式化都是理论上的原则,现实业务中,很少会很极端的只使用其中一种,而是结合实际需求,混合使用范式化和反范式化。

        最常见的反范式的数据方法是复制冗余或缓存。在不同的表中存储相同的特定列,以便于查询时减少表关联来提升效率。

        有时提升性能的最好方法是在同一张表中保存衍生的冗余数据。也是通过空间换时间的思想。

        选择范式化或反范式化需要综合考虑应用场景、性能要求、数据一致性和维护复杂性。在实际开发中,可能需要根据具体情况进行调整,以达到最佳效果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2210899.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【PR小技巧】PR技术分享 一 PR关键帧小技巧介绍

在Adobe Premiere Pro (简称PR) 中,关键帧是用于控制视频剪辑、音频轨道、效果动画等随时间变化的重要工具。通过合理使用关键帧,可以实现各种复杂的动画效果和精确的时间控制。今天我们就来学习一些关于关键帧的小技巧,以及具体的例子来说明…

算法专题五: 位运算

目录 常见位运算总结1. 位1的个数2. 比特位计数3. 汉明距离4. 只出现一次的数字5. 只出现一次的数字Ⅲ6. 判定字符是否唯一7. 丢失的数字8. 两正数之和9. 只出现一次的数字Ⅲ10. 消失的两个数字 常见位运算总结 重点 : 1. 位1的个数 算法思路: 这道题就用到了我们总结的那个第…

全新YOLOv11美化版检测界面 涵盖超多功能 支持百种模型改进训练

文章目录 前言视频效果必要环境一、界面功能概述1. 运行方法2. 图像选择图像:表格信息:统计信息:IOU和NMS调节:目标框显示: 3. 文件夹选择文件夹:进度显示:推理结果: 4. 视频、摄像头进度显示:实时检测:帧状态回溯: 5. 替换界面中的模型5. 鼠标悬浮 二、训练改进模型运行方法假…

力扣周赛:第419场周赛

👨‍🎓作者简介:爱好技术和算法的研究生 🌌上期文章:力扣周赛:第415场周赛 📚订阅专栏:力扣周赛 希望文章对你们有所帮助 因为一些特殊原因,这场比赛就打了1h&#xff0c…

[Linux] Linux 模拟实现 Shell

标题:[Linux] Linux 模拟实现 Shell 个人主页水墨不写bug(图片来源于网络) 目录 一、什么是shell 二、shell的理解 三、模拟实现shell 1)打印命令行提示 2)获取用户的输入字符串 3)分割命令字符串 4…

【优选算法篇】双指针的优雅舞步:C++ 算法世界的浪漫探索

文章目录 C 双指针详解:基础题解与思维分析前言第一章:对撞指针1.1 移动零解题思路图解分析C代码实现易错点提示代码解读 1.2 复写零解题思路算法步骤C代码实现易错点提示代码复杂度 1.3 盛最多水的容器1. 题目链接2. 题目描述解法一(暴力求解…

链表(4)_合并K个升序链表_面试题

个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 链表(4)_合并K个升序链表_面试题 收录于专栏【经典算法练习】 本专栏旨在分享学习算法的一点学习笔记,欢迎大家在评论区交流讨论💌 目录…

第十五届蓝桥杯C++B组省赛

文章目录 1.握手问题解题思路1(组合数学)解题思路2(暴力枚举) 2.小球反弹做题思路 3.好数算法思路(暴力解法)---不会超时 4.R格式算法思路 5.宝石组合算法思路---唯一分解定理 6.数字接龙算法思路----DFS 7…

【Oracle数据库进阶】001.SQL基础查询_查询语句

课 程 推 荐我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈虚 拟 环 境 搭 建 :&#x1…

Egg考古系列-EggCore的生命周期

关于EGG egg框架的第一个版本还是2017-03-21,距今已有7年了。虽然最近几年没有什么更新,但它在国内的使用还是挺多的,mvc的分层模式也很受大家喜欢。虽然声称是面向企业级、中大型项目场景的框架,但这种约定式在大型项目中其实也很…

高校学科竞赛管理:SpringBoot实现的高效策略

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常…

【M2-Mixer】核心方法解读

abstract: 在本文中,我们提出了M2-Mixer,这是一种基于MLPMixer的结构,具有多头损失,用于多模态分类。它比基于卷积、循环或神经结构搜索的基线模型具有更好的性能,其主要优势是概念和计算简单。所提出的多…

【电子电力】LCL滤波器设计,包括电流控制调谐

摘要 LCL 滤波器是电力电子领域中广泛应用于并网逆变器的滤波器之一,其主要功能是减少高频开关的谐波,确保输出电流的质量。本文设计并实现了基于 MATLAB 的 LCL 滤波器模型,结合电流控制器和调谐技术,验证了其在谐波抑制方面的效…

从RNN讲起(RNN、LSTM、GRU、BiGRU)——序列数据处理网络

文章目录 RNN(Recurrent Neural Network,循环神经网络)1. 什么是RNN?2. 经典RNN的结构3. RNN的主要特点4. RNN存在问题——长期依赖(Long-TermDependencies)问题 LSTM(Long Short-Term Memory&a…

PostgreSQL学习笔记七:常规SQL操作

PostgreSQL 支持标准的 SQL 语句,同时也扩展了一些特有的功能。以下是一些常规的 SQL 语句示例,这些示例涵盖了数据定义、数据操作和数据查询的基本操作: 数据定义语言 (DDL 创建数据库: CREATE DATABASE mydatabase;创建表&#…

stm32单片机个人学习笔记9(TIM输入捕获)

前言 本篇文章属于stm32单片机(以下简称单片机)的学习笔记,来源于B站教学视频。下面是这位up主的视频链接。本文为个人学习笔记,只能做参考,细节方面建议观看视频,肯定受益匪浅。 STM32入门教程-2023版 细…

AWD入门

一、简介 AWD(Attack With Defense,攻防兼备)模式。你需要在一场比赛里要扮演攻击方和防守方,攻者得分,失守者会被扣分。也就是说攻击别人的靶机可以获取 Flag 分数时,别人会被扣分,同时你也要保护自己的主机不被别人…

Docker 教程四 (Docker 镜像加速)

Docker 镜像加速 国内从 DockerHub 拉取镜像有时会遇到困难,此时可以配置镜像加速器。 目前国内 Docker 镜像源出现了一些问题,基本不能用了,后期能用我再更新下。* Docker 官方和国内很多云服务商都提供了国内加速器服务,例如…

Python网络爬虫入门指南

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…

MPA-SVM多变量回归预测|海洋捕食者优化算法-支持向量机|Matalb

目录 一、程序及算法内容介绍: 基本内容: 亮点与优势: 二、实际运行效果: 三、算法介绍: 四、完整程序下载: 一、程序及算法内容介绍: 基本内容: 本代码基于Matlab平台编译&am…