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

【数据库设计和SQL基础语法】--数据库设计基础--数据规范化和反规范化

一、 数据规范化

1.1 数据规范化的概念
  1. 定义
    数据规范化是数据库设计中的一种方法,通过组织表结构,减少数据冗余,提高数据一致性和降低更新异常的过程。这一过程确保数据库中的数据结构遵循一定的标准和规范,使得数据存储更加高效、可靠,并降低了数据冗余的程度。
  2. 目的
    • 降低数据冗余: 通过规范化,将数据存储在多个表中,避免在数据库中存储相同的信息,减少数据冗余,提高存储效率。
    • 避免插入异常: 数据规范化有助于避免插入异常,确保在插入新数据时不会因为表结构不合理而导致无法插入或插入错误的问题。
    • 避免更新异常: 通过将数据分解成更小的表,规范化可以减少更新异常,确保在更新数据时不会因为表结构的复杂性而引起错误。
    • 避免删除异常: 数据规范化还有助于避免删除异常,确保删除操作只会删除需要删除的数据,而不会影响其他相关的数据。
    • 提高数据一致性: 数据规范化使数据存储结构更为统一和一致,有助于维护数据的一致性,避免了数据在数据库中的不一致性问题。

数据规范化通过一系列的步骤和规则,将数据库设计得更加合理和有序,以满足数据库的存储和维护需求。

1.2 数据规范化的范式
  1. 第一范式(1NF)
    • 定义: 数据表中的每一列都是不可分割的基本数据项,不包含重复的列。
    • 目的: 消除重复的数据,确保每个字段的原子性,减少数据冗余。
  2. 第二范式(2NF)
    • 定义: 在1NF的基础上,非主键列完全依赖于主键,而不是依赖于主键的一部分。
    • 目的: 消除部分依赖,进一步减少数据冗余,确保数据表的结构更为合理。
  3. 第三范式(3NF)
    • 定义: 在2NF的基础上,消除非主键列之间的传递依赖,即任何非主键列都不依赖于其他非主键列。
    • 目的: 消除传递依赖,进一步提高数据表的稳定性和一致性。
  4. Boyce-Codd范式(BCNF)
    • 定义: 在3NF的基础上,要求任何非主键列不依赖于主键的任何超键。
    • 目的: 消除主键依赖产生的问题,确保表的完全依赖关系。
  5. 第四范式(4NF)
    • 定义: 在BCNF的基础上,进一步消除多值依赖。
    • 目的: 处理表中存在多个独立的多值关系的情况。
  6. 第五范式(5NF)
    • 定义: 在4NF的基础上,处理半依赖和连接依赖。
    • 目的: 保证数据表中没有隐含的依赖关系,进一步提高数据的一致性和稳定性。

数据规范化的范式提供了一系列规则,通过这些规则,设计者可以有效地组织数据库结构,降低冗余,确保数据的一致性和完整性。选择合适的范式取决于具体的业务需求和数据特点。

二、 反规范化

2.1 反规范化的概念
  1. 定义:
    反规范化是一种数据库设计的技术,通过有意地引入冗余以提高查询性能或简化数据模型。在反规范化中,设计者允许某些冗余存在,以换取对特定查询的更快响应或更简单的数据模型。
  2. 目的:
    • 提高性能: 通过减少连接操作和冗余数据的存储,反规范化可以加速某些查询的执行速度,特别是涉及多个表的复杂查询。
    • 简化查询: 将数据冗余存储在一个表中,可以减少复杂的联接操作,使查询更加简单和直观。
    • 缓解复杂性: 在某些情况下,正规化的数据模型可能过于复杂,反规范化可以简化模型,使其更易于理解和维护。
  3. 常见反规范化技术:
    • 合并表: 将正规化的表合并为一个表,减少联接操作。
    • 添加冗余列: 在表中添加冗余列,避免对其他表的频繁查询。
    • 使用计算字段: 引入计算字段,存储在其他表中的计算结果,以减轻查询时的计算负担。
  4. 注意事项:
    • 反规范化是一种权衡,需要根据具体情况谨慎使用,以避免引入不一致性和维护困难。
    • 反规范化可能增加对更新操作的复杂性,因为冗余数据的维护需要确保同步。
    • 在频繁进行写操作的系统中,反规范化可能导致性能下降,因为维护冗余数据可能带来额外的开销。

反规范化在某些特定场景下是有益的,但设计者需要仔细评估数据库系统的需求和性能目标,以确定何时使用反规范化技术。

2.2 反规范化的常见技术

反规范化是数据库设计中的一种策略,通常通过有意地引入冗余数据以提高查询性能或简化模型。以下是一些常见的反规范化技术:

  1. 合并表 (Table Merging)

    • 描述: 将多个表合并成一个表,以减少联接操作。
    • 应用场景: 当多个表之间存在频繁的联接,而查询性能受到影响时。
  2. 冗余列 (Redundant Columns)

    • 描述: 在一个表中引入冗余列,存储其他表中的信息,避免频繁的联接。
    • 应用场景: 当某些查询需要从多个表中获取相同的信息时。
  3. 计算字段 (Computed Fields):

    • 描述: 引入计算字段,存储在其他表中的计算结果,减轻查询时的计算负担。
    • 应用场景: 当某个字段的值可以通过其他字段的计算得出时。
  4. 材料化视图 (Materialized Views):

    • 描述: 将视图的查询结果存储为表,避免每次查询都重新计算。
    • 应用场景: 当某个视图的计算成本较高,而且数据变化频率较低时。
  5. 缓存 (Caching):

    • 描述: 缓存查询结果,避免对数据库进行频繁查询。
    • 应用场景: 当一些查询结果在短时间内保持不变时,通过缓存提高性能。
  6. 分区 (Partitioning):

    • 描述: 将表分成较小的物理存储单元,可以根据查询的特性选择性地操作部分数据。
    • 应用场景: 当表过大,而且查询通常只涉及其中一部分数据时。
  7. 通过预计算优化查询 (Precomputed Optimization):

    • 描述: 提前计算并存储查询的结果,以减少运行时的计算负担。
    • 应用场景: 当某些查询的计算成本高,但查询结果变化较慢时。
  8. 垂直划分 (Vertical Partitioning):

    • 描述: 将表按列进行划分,将不同的列存储在不同的表中,降低表的宽度。
    • 应用场景: 当表中包含大量的列,但每次查询只需要使用其中一部分列时。

Tip:注意事项:

  • 反规范化是一种权衡,需要根据具体场景和性能需求进行考虑。
  • 引入冗余时,需要确保数据的一致性和同步性。
  • 在写入密集型的系统中,反规范化可能导致维护冗余数据的复杂性。

三、 数据规范化与反规范化的权衡

3.1 设计考虑因素

在数据库设计中,数据规范化和反规范化是两种相对的策略,它们在一定程度上存在权衡。设计者需要综合考虑多个因素,以确定何时使用规范化,何时采用反规范化。以下是一些设计考虑因素:

  1. 查询性能与写入性能(Read vs. Write):
    • 规范化: 适用于写入密集型操作,有助于避免冗余数据,确保数据一致性。
    • 反规范化: 适用于读取密集型操作,通过引入冗余数据提高查询性能。
  2. 系统复杂性:
    • 规范化: 有助于维护数据的一致性,减少冗余,但可能需要复杂的联接操作。
    • 反规范化: 可能引入冗余,增加系统复杂性,但简化了查询。
  3. 存储空间:
    • 规范化: 通常需要更少的存储空间,因为避免了冗余数据。
    • 反规范化: 可能需要更多的存储空间,因为引入了冗余数据。
  4. 数据一致性:
    • 规范化: 更容易维护数据的一致性,因为没有冗余数据。
    • 反规范化: 需要额外的机制来确保冗余数据的一致性。
  5. 查询复杂性:
    • 规范化: 查询可能需要更多的联接操作,增加查询的复杂性。
    • 反规范化: 查询可能更简单,因为冗余数据减少了联接操作。
  6. 系统的整体性能:
    • 规范化: 在写入密集型系统中可能更适用,因为它有助于维护数据的一致性。
    • 反规范化: 在读取密集型系统中可能更适用,因为它有助于提高查询性能。
  7. 变更频率:
    • 规范化: 适用于数据变更频繁的场景,因为规范化减少了更新的复杂性。
    • 反规范化: 适用于数据变更较少的场景,因为冗余数据的更新可能较为复杂。
  8. 业务需求:
    • 规范化: 适用于需要强调数据一致性和避免冗余的业务场景。
    • 反规范化: 适用于需要强调查询性能和简化查询的业务场景。
3.2 实际应用场景

在数据库设计中,数据规范化与反规范化的权衡是根据具体应用场景和需求而定的。以下是一些实际应用场景,说明何时选择规范化或反规范化:

  1. 在线交易处理系统(OLTP):
    • 规范化: 对于OLTP系统,通常更注重数据的一致性和避免冗余。规范化有助于减少数据更新时的复杂性,确保事务的一致性。适用于频繁的数据更新和事务处理。
    • 反规范化: 在OLTP系统中,某些读取操作可能是频繁且复杂的。为了提高查询性能,可以考虑在一些查询频繁的表上进行反规范化,引入冗余数据以减少联接操作。
  2. 数据仓库(Data Warehouse):
    • 规范化: 数据仓库通常用于大量的分析查询,而不是频繁的事务处理。在这种情况下,规范化有助于维持数据的一致性,避免冗余,因为数据加载和更新相对较少。
    • 反规范化: 为了提高查询性能,可以在数据仓库中采用反规范化策略,将数据组织成更适合分析的形式,减少联接操作和提高查询速度。
  3. 社交媒体平台:
    • 规范化: 用户在社交媒体平台上进行频繁的互动,包括评论、点赞等。规范化有助于维持这些互动的一致性,避免数据冗余。
    • 反规范化: 在社交媒体平台中,用户信息和关系网可能非常庞大。为了提高检索用户信息和关系的性能,可以考虑在某些查询频繁的场景下进行反规范化。
  4. 日志和审计系统:
    • 规范化: 对于记录日志和审计的系统,规范化有助于确保记录的一致性和避免重复信息。
    • 反规范化: 在需要快速查询和分析日志数据的场景下,可以采用反规范化以提高查询性能,虽然可能会引入一些冗余。
  5. 在线广告平台:
    • 规范化: 对于广告平台,规范化可用于维护广告和用户数据的一致性。
    • 反规范化: 为了提高广告投放和用户定位的查询性能,可以在某些情况下采用反规范化,例如在广告定向和分析的数据表中。

四、 示例与案例分析

4.1 数据规范化的实例

假设我们有一个简化的在线图书馆系统,包括以下实体:图书(Book)作者(Author)出版社(Publisher),以及它们之间的关系。

  1. 第一范式(1NF)规范化:

    • Book (图书表)
    字段描述
    book_id主键
    title
    author_id外键
    publisher_id外键
    publication_date
    price
  2. 作者表 (Author):

    字段描述
    author_id主键
    author_name
  3. 出版社表 (Publisher):

    字段描述
    publisher_id主键
    publisher_name

这种规范化方式解决了冗余数据的问题,通过引入外键关联表,减少了数据冗余,并提高了一致性。

第二范式(2NF)规范化:

在第一范式的基础上,进一步消除部分数据依赖。

  1. 图书表 (Book):

    字段描述
    book_id主键
    title
    author_id外键
    publisher_id外键
    publication_date
    price
  2. 作者表 (Author):

    字段描述
    author_id主键
    author_name
  3. 出版社表 (Publisher):

    字段描述
    publisher_id
    publisher_name

这样设计消除了对 author_namepublisher_name 的部分依赖,确保每个属性都完全依赖于关键字。

第三范式(3NF)规范化:

在第二范式的基础上,进一步消除传递依赖。

  1. 图书表 (Book):

    字段描述
    book_id主键
    title
    author_id外键
    publisher_id外键
    publication_date
    price
  2. 作者表 (Author):

    字段描述
    author_id主键
    author_name
  3. 出版社表 (Publisher):

    字段描述
    publisher_id主键
    publisher_name

这样设计确保了每个属性都只依赖于图书表中的主键 book_id,进一步提高了数据的规范化程度。

这是一个简化的示例,实际数据库设计可能涉及更多的表和关系。规范化的目标是减少冗余、提高一致性,但在实际应用中需要根据具体情况进行权衡。

4.2 反规范化的实例

假设我们有一个包含订单信息的数据库,包括订单(Orders)、顾客(Customers)和产品(Products)三个表。在进行反规范化时,我们可以考虑将某些数据冗余存储以提高查询性能。在订单表中包含了顾客和产品的冗余信息,避免了关联查询。

  1. 订单表 (Orders):

    字段描述
    order_id主键
    customer_id外键
    product_id外键
    order_date
    quantity
    total_price
    customer_name冗余
    customer_address冗余
    product_name冗余
    product_price冗余

这种冗余设计有助于提高查询性能,特别是在需要频繁执行包含顾客和产品信息的查询时,避免了多表关联操作。然而,它也引入了一些挑战:

  • 数据冗余: 冗余数据可能导致更新异常,如果顾客或产品信息发生变化,需要更新多个订单记录。
  • 空间占用: 冗余数据占用了额外的存储空间。
  • 一致性问题: 冗余数据的一致性需要开发者在更新时进行维护。

在实际应用中,反规范化通常是基于具体查询需求和性能优化的权衡考虑。在某些场景下,牺牲一些规范性以换取更好的性能是可以接受的。

五、 总结

数据规范化是通过组织表结构减少冗余,提高数据一致性的方法,分为1NF、2NF、3NF等范式。反规范化通过引入冗余提高查询性能,但需权衡空间、一致性和复杂性。选择取决于读写操作、系统复杂性、存储空间等因素。实例展示了规范化与反规范化在图书馆和订单系统中的应用。在设计数据库时,需根据具体需求综合考虑这两种策略。

相关文章:

【数据库设计和SQL基础语法】--数据库设计基础--数据规范化和反规范化

一、 数据规范化 1.1 数据规范化的概念 定义 数据规范化是数据库设计中的一种方法,通过组织表结构,减少数据冗余,提高数据一致性和降低更新异常的过程。这一过程确保数据库中的数据结构遵循一定的标准和规范,使得数据存储更加高…...

复亚智能交通无人机:智慧交通解决方案大公开

城市的现代化发展离不开高效的交通管理规划。传统的交通管理系统庞大繁琐,交警在执行任务时存在安全隐患。在这一背景下,复亚智能交通无人机应运而生,成为智慧交通管理中的重要组成部分。交通无人机凭借其高灵活性、低成本、高安全性等特点&a…...

MYSQL 及 SQL 注入

文章目录 前言什么是sql注入防止SQL注入Like语句中的注入后言 前言 hello world欢迎来到前端的新世界 😜当前文章系列专栏:Mysql 🐱‍👓博主在前端领域还有很多知识和技术需要掌握,正在不断努力填补技术短板。(如果出现…...

古埃及金字塔的修建

从理论上说,古埃及人完全有能力设计并建造出充满各种奇妙细节的胡夫金字塔,但后世还是不断涌现出质疑之声,原因倒也简单,那就是胡夫金字塔实在太大了。据推算,整座金字塔使用大约230万块巨石,总质量可达约5…...

Android 13.0 系统settings系统属性控制一级菜单显示隐藏

1.概述 在13.0的系统rom定制化开发中,系统settings的一级菜单有些在客户需求中需要去掉不显示,所以就需要通过系统属性来控制显示隐藏, 从而达到控制一级菜单的显示的目的,而系统settings是通过静态加载的方式负责显示隐藏,接下来就来实现隐藏显示一级菜单的 功能实现 2.…...

STM32 寄存器配置笔记——USART配置中断接收乒乓缓存处理

一、概述 本文主要介绍如何配置USART接收中断,使用乒乓缓存的设计接收数据并将其回显在PC 串口工具上。以stm32f10为例,配置USART1 9600波特率。具体配置参考上一章节STM32 寄存器配置笔记——USART配置 打印。 乒乓缓存的设计应用场景:当后面…...

第二十一章 解读XML与JSON文件格式(工具)

XML XML tree and elements 将XML文档解析为树(tree) 我们先从基础讲起。XML是一种结构化、层级化的数据格式,最适合体现XML的数据结构就是树。ET提供了两个对象:ElementTree将整个XML文档转化为树,Element则代表着…...

Web 自动化神器 TestCafe(三)—用例编写篇

一、用例编写基本规范 1、 fixture 测试夹具 使用 TestCafe 编写测试用例,必须要先使用 fixture 声明一个测试夹具,然后在这个测试夹具下编写测试用例,在一个编写测试用例的 js 或 ts 文件中,可以声明多个测试夹具 fixture(测试…...

Redis 基本命令—— 超详细操作演示!!!

内存数据库 Redis7—— Redis 基本命令 三、Redis 基本命令(下)3.8 benchmark 测试工具3.9 简单动态字符串SDS3.10 集合的底层实现原理3.11 BitMap 操作命令3.12 HyperLogLog 操作命令3.13 Geospatial 操作命令3.14 发布/订阅命令3.15 Redis 事务 四、Re…...

Linux:centOS常用命令

CentOS是一种基于Red Hat Enterprise Linux(RHEL)的开源操作系统,因此与其他基于Linux的系统共享很多相似的命令。以下是一些在CentOS上常用的命令 件和目录操作: ls: 列出目录内容。cd: 切换目录。pwd: 显示当前工作目录。mkdir: 创建目录…...

数据结构-二叉树(1)

1.树概念及结构 1.1树的概念 树是一种非线性的数据结构,它是由n(n>0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。 1.有一个特殊的结点&…...

SpringBoot——国际化

优质博文:IT-BLOG-CN 一、Spring 编写国际化时的步骤 【1】编写国际化配置文件; 【2】使用ResourceBundleMessageSource管理国际化资源文件; 【3】在页面使用ftp:message取出国际化内容; 二、SpringBoot编写国际化步骤 【1】创…...

shell 条件语句 if case

目录 测试 test测试文件的表达式 是否成立 格式 选项 比较整数数值 格式 选项 字符串比较 常用的测试操作符 格式 逻辑测试 格式 且 (全真才为真) 或 (一真即为真) 常见条件 双中括号 [[ expression ]] 用法 &…...

C语言:写一个函数,实现3*3矩阵的转置(指针)

分析: 在主函数 main 中,定义一个 3x3 的整型数组 a,并定义一个指向整型数组的指针 p。然后通过循环结构和 scanf 函数,从标准输入中读取用户输入的 3x3 矩阵的值,并存储到数组 a 中。 接下来,调用 mov…...

STL pair源码分析

STL pair源码分析 pair是STL中提供的一个简单的struct,用来处理类型不同的一对值,是非常常用的数据结构。这一对值是以public的形式暴露出来的,直接通过first和second就能访问。我们以MSVC提供的STL源码为例,分析pair的具体实现。…...

【开源】基于Vue和SpringBoot的农家乐订餐系统

项目编号: S 043 ,文末获取源码。 \color{red}{项目编号:S043,文末获取源码。} 项目编号:S043,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用户2.2 管理员 三、系统展示四、核…...

MyBatis 操作数据库(入门)

一:MyBatis概念 (1)MyBatis 💗MyBatis是一款优秀的持久层框架,用于简化JDBC的开发 (2)持久层 1.持久层 💜持久层:持久化操作的层,通常指数据访问层(dao),是用来操作数据库的 2.持久层的规范 ①…...

JVM——垃圾回收器(G1,JDK9默认为G1垃圾回收器)

1.G1垃圾回收器 JDK9之后默认的垃圾回收器是G1(Garbage First)垃圾回收器。 Parallel Scavenge关注吞吐量,允许用户设置最大暂停时间 ,但是会减少年轻代可用空间的大小。 CMS关注暂停时间,但是吞吐量方面会下降。 而G1…...

多模态——使用stable-video-diffusion将图片生成视频

多模态——使用stable-video-diffusion将图片生成视频 0. 内容简介1. 运行环境2. 模型下载3. 代码梳理3.1 修改yaml文件中的svd路径3.2 修改DeepFloyDataFiltering的vit路径3.3 修改open_clip的clip路径3.4 代码总体结构 4. 资源消耗5. 效果预览 0. 内容简介 近期,…...

springboot(ssm网络相册 在线相册管理系统Java(codeLW)

springboot(ssm网络相册 在线相册管理系统Java(code&LW) 开发语言:Java 框架:ssm/springboot vue JDK版本:JDK1.8(或11) 服务器:tomcat 数据库:mysql 5.7(或8.0&#xff09…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...

【Oracle APEX开发小技巧12】

有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序

一、开发环境准备 ​​工具安装​​: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 ​​项目初始化​​: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

什么是EULA和DPA

文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...