一文详解数据库范式

背景

        在开发中,我们经常需要考虑如何设计合适的表结构,而则往往需要考虑数据库的范式。数据库的三范式(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.mzph.cn/web/55043.shtml

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

相关文章

SpringSecurity框架核心组件详解

Spring Security 是一个功能强大且灵活的身份验证和访问控制框架,在很多项目中都会采用该框架来实现权限控制功能。 Authentication(身份验证):用于验证用户的身份,通常通过用户名和密码进行身份验证。Authorization&…

oracle数据坏块处理(一)-通过rman备份修复

表有坏块时,全表查询会报错: 这时候如果有前面正常的rman备份,那么我们就可以通过rman备份直接对数据文件块做恢复 先对数据文件做个逻辑检查: RMAN> backup check logical VALIDATE DATAFILE EXB_DATA/exb/datafile/cuteinf…

C#中Assembly3个获取路径的方法

在C#中,经常要获取路径 ,可以通过Assembly的三个重载方法来获取,如下所示这三个分别是GetCallingAssembly、GetEntryAssembly和GetExecutingAssembly。 string tmpEntryPath Assembly.GetEntryAssembly().Location;string tmpExeasmPath As…

【VUE】会员管理(增删改查)

前端 router/index.js import { createRouter, createWebHistory } from vue-router import {userInfoStore} from "/stores/user.js";const router createRouter({history: createWebHistory(import.meta.env.BASE_URL),routes: [{path: /login,name: login,comp…

SpringBoot智能推荐:健康生活新趋势

摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了基于智能推荐的卫生健康系统的开发全过程。通过分析基于智能推荐的卫生健康系统管理的不足,创建了一个计算机管理基于智能推荐的卫生健康系统的方案。…

STM32CubeIDE使用ADC采用DMA重大BUG

问题描述 STM32CubeIDE 1.8.0问题 大牛攻城狮最近调试STM32L151CBT6。由于项目上使用该款芯片做控制电源使用,其中涉及到多路ADC的数据采样。使用STM32CubeIDE 1.8.0版本详细如下图所示 这里大概率是STM32CubeMX版本太低了,从图上看才是6.4.0 注意这里…

五、UI弹窗提示

一、制作弹窗UI 二、创建脚本 1、继承WindowRoot(UI基类) 获取UI上面的组件 2、初始化 将这个文本失活 3、写一个提示出现的方法 这个派生类中,继承了基类的两个方法,设置显示和设置文本 对应基类的这两个方法 将动画赋值给动…

shell $ 用法

Shell脚本中$符号的几种用法小结_linux shell_脚本之家 Shell 传递参数 | 菜鸟教程 $ 符号说明$0Shell 的命令本身1到9表示 Shell 的第几个参数$?显示最后命令的执行情况$#传递到脚本的参数个数$$脚本运行的当前进程 ID 号$*以一个单字符串显示所有向脚本传递的参数$!后台运行…

25.1 降低采集资源消耗的收益和无用监控指标的判定依据

本节重点介绍 : 降低采集资源消耗的收益哪些是无用指标,什么判定依据 通过 grafana的 mysql 表获取所有的 查询表达式expr通过 获取所有的prometheus rule文件获取所有的 告警表达式expr通过 获取所有的prometheus 采集器接口 获取所有的采集metrics计算可得到现在…

机器学习、深度学习评价指标汇总:TP、TN、FP、FN、AP、mAP、IoU、mAP@3、Prec@10、 Acc@10

系列文章目录 文章目录 系列文章目录一、真正例(True Positive)、假正例(False Positive)、真负例(True Negative)和假负例(False Negative)是评估分类模型性能的重要概念。1. 定义2…

前端学习-css的元素显示模式(十五)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 什么是元素显示模式 块元素 常见的块元素 块元素的特点 注意 行内元素 行内元素的特点 注意 行内块元素 行内块元素的特点 元素显示模式的转换 语法格…

MySQL 删除数据库

1.使用命令行删除一个数据库 1.1 首先登陆进入 MySQL 操作界面,命令如下: 命令 : mysql -utest -p;1.2 登陆成功之后可以使用如下命令查看当前已有数据库: 命令 : SHOW DATABASES; 执行结果如下图: 如图所示当前已包含 MySQL 系统数据库和…

盛元广通化学实验室样品LIMS管理系统

盛元广通化学实验室样品LIMS管理系统旨在提高实验室样品管理的效率、准确性和可追溯性。通过自动化和智能化的手段,系统能够简化样品管理流程,减少人为错误,确保样品的安全性和完整性。样品管理的具体实施方法包括样品接收与登记、样品储存与…

「Ubuntu」文件权限说明(drwxr-xr-x)

我们在使用Ubuntu 查看文件信息时,常常使用 ll 命令查看,但是输出的详细信息有些复杂,特别是 类似与 drwxr-xr-x 的字符串,在此进行详细解释下 属主:所属用户 属组:文件所属组别 drwxr-xr-x 7 apps root 4…

基于SSM的商场鞋店管理系统的设计与实现

文未可获取一份本项目的java源码和数据库参考。 题目简介: 服装鞋帽在我国的国民经济的发展中有着重要的地位,是发展规模较为宏大的行业。随着我国制鞋企业的发展和规模的扩大,经营区域分散,传统的管理模式严重制约了企业的快速…

Android SELinux——Sepolicy基础语法(四)

通过前面的文章内容,我们对 SELinux 目录和 te 文件有一个初步的了解,这里我们继续研究Sepolicy 的语法规范。 一、Sepolicy语言介绍 Linux 中有两种东西,一种死的(Inactive),一种活的(Active)。活的东西就是进程,而死的东西就是文件(Linux 哲学,万物皆文件。注意,…

非洲秃鹫算法(AVOA)的MATLAB代码复现

目录 1 非洲秃鹫算法优化BP神经网络代码复现 2 非洲秃鹫算法优化支持向量机代码复现 3 非洲秃鹫算法优化长短期记忆神经网络代码复现 1 非洲秃鹫算法优化BP神经网络代码复现 1)单输出回归预测:单输出回归预测:非洲秃鹫算法优化BP神经网络…

package.json配置

package.json配置 描述配置文件配置脚本配置依赖配置发布配置系统配置第三方配置 描述配置 name : 项目名称,第三方包可以通过npm install 包名安装 "name":"react"version : 项目版本,项目版本号 "version" : "18.2…

Ubuntu 启动引导如何修复(直接进入grub怎么办)

如果 Ubuntu 系统启动时直接进入 GRUB 界面,而不是直接启动操作系统,原因是: GRUB 配置文件丢失或损坏 解决方法 一、手动引导系统(临时方案) GRUB 的配置文件(/boot/grub/grub.cfg)损坏。通…

华为Eth-trunk链路聚合加入到E-trunk实现跨设备的链路聚合

一、适用场景(注:e-trunk与eth-trunk是2个不同的概念) 1、企业中有重要的server服务器业务不能中断的情况下,可将上行链路中的汇聚交换机,通过eth-trunk链路聚合技术,实现链路故障后,仍有可用的…