【系统设计】如何权衡范式与反范式设计

一、什么是范式设计与反范式设计

1.1、范式设计(Normalization)

定义:

范式设计是数据库设计中最基础的设计原则之一,它主要通过规范化数据模型,减少数据冗余和数据不一致的问题。

常用的范式

  1. 第一范式(1NF):要求数据库中的每个字段都是原子性的,即每个字段都是一个不可再分的数据项。例如,学生的姓名和成绩应分别单独作为一个字段,而不是放在同一个字段中。

  2. 第二范式(2NF):要求数据库中的每个非主键字段都完全依赖于主键。这意味着非主键字段不能依赖于其他非主键字段。例如,在一个课程信息表中,如果学分依赖于学期而不是课程编号,那么就不符合第二范式。

  3. 第三范式(3NF):要求数据库中的每个非主键字段都不依赖于其他非主键字段。换句话说,非主键字段之间不应该存在传递依赖关系。例如,在订单信息表中,如果商品价格依赖于商品编号而不是订单号,那么就不符合第三范式。

目的:

  • 消除数据冗余,提高数据的一致性和完整性。

  • 降低数据维护成本,提升数据库的扩展性、容错性及可用性。

1.2、反范式设计(Denormalization)

定义:

反范式设计是根据具体业务需求灵活地对数据库进行设计,追求更高的性能和效率。它违反了范式中的一些规则,允许部分数据的冗余和冗长,以提高查询和操作的速度。

特点:

  • 允许数据冗余,以提高查询性能。

  • 适用于需要频繁读取数据且对写入性能要求不高的场景。

范式设计的对比:

  • 范式设计注重数据的规范化和减少冗余,而反范式设计则更注重查询性能。

  • 在某些情况下,反范式设计可能会导致数据更新和维护的复杂性增加,因为需要更新多个地方的数据以确保数据的一致性。

二、系统设计与Coding方面的思考

2.1、范式设计Join查询带来的影响

场景:查询该订单下的商品信息

查询SQL:

SELECT t_sku.sku_name FROM t_order 
LEFT JOIN t_sku ON t_order.sku_id = t_sku.id WHERE order.id = 1

有什么问题:(这也是互联网公司为什么建议采用单表查询的原因)

  • 如果关联的表比较多,性能会急剧下降,产生慢sql,慢sql对系统来说是致命的;

  • 考虑分库分表

    • 如果后面存储数据过大,需要采用分库分表方案,那我们需要对SQL进行重新改造,所带来的成本跟风险都蛮大的。

如果不采用SQL进行关联查询,采用在代码层面进行Join,会有什么影响?

查询代码如下:

SELECT sku_id FROM t_order WHERE id = 1

SELECT id FROM t_sku WHERE id = id

会带来什么问题?

  • 如果数据量比较多,会对应用节点内存带来一定压力,甚至会带来FullGC

看到这里,我们其实可以用字段冗余来解决(反范式设计的体现)

我们可以在订单表里面冗余sku名称,这样就能实现需求,也能解决Join查询带来的挑战。

SELECT sku_name FROM t_order WHERE id = 1

2.2、冗余字段(反范式设计)带来的挑战

2.2.1、数据副本的一致性

  • 数据冗余:反范式化技术的主要特点之一是数据的冗余存储。这意味着相同的数据可能在多个表中都有副本。

  • 不一致的风险:当修改了某个数据副本而忘记更新其他副本时,数据就会出现不一致的情况。这种情况在更改频繁的数据中尤为突出。

更新操作的复杂性

  • 更新操作的复杂性:由于反范式化技术增加了数据冗余,每个副本都需要进行更新以维持一致性。这增加了更新操作的复杂度,并容易出错。

数据一致性的维护策略

  • 事务处理:使用事务来保证一致性,即要么所有相关的表都更新成功,要么都回滚到更新前的状态。

  • 定时器更新:在数据更新后,使用定时器来定时更新其他相关数据,确保数据的一致性。

  • 触发器:当数据被修改时,触发其他相关数据的修改,从而确保数据的一致性。

2.2.2、分布式事务

  • 数据冗余:反范式设计通过有意地冗余部分数据以提高查询性能。然而,在分库分表的场景中,这种冗余数据可能导致分布式事务的复杂性增加。

  • 一致性挑战:当修改一个数据副本时,需要确保所有相关副本都得到更新,以保持数据一致性。这涉及到跨多个数据库或数据表的事务操作。

分布式事务的复杂性

  • 跨库事务:当更新内容同时分布在不同库中时,会带来跨库事务问题。这些事务需要协调多个数据库节点,增加了事务的复杂性和执行时间。

  • 两阶段提交和XA协议:为了解决跨库事务问题,一般可使用“XA协议”和“两阶段提交”处理。这些方法虽然能最大限度保证数据库操作的原子性,但在提交事务时需要协调多个节点,推后了提交事务的时间点,延长了事务的执行时间。

分布式事务带来的其他问题

  • 性能影响:随着数据库节点的增多,分布式事务可能导致性能下降,因为每次事务都需要跨多个节点进行通信和协调。

  • 死锁和冲突:在分布式系统中,由于网络延迟和故障等因素,事务在访问共享资源时可能发生冲突或死锁,进一步增加了事务管理的复杂性。

解决方案和策略

  • 全局表:为了避免跨库join查询,可以将一些全局性的、较少修改的表(如“数据字典表”)在每个数据库中都保存一份。这样可以减少跨库事务的需求。

  • 字段冗余:一种典型的反范式设计,利用空间换时间,为了性能而避免join查询。但这种方法也增加了数据冗余和分布式事务的复杂性。

  • 最终一致性:对于性能要求高但对一致性要求不高的系统,可以采用最终一致性策略。即不苛求系统的实时一致性,而是在允许的时间段内达到最终一致性。这可以通过事务补偿、数据对账等方式实现。

2.2.3、CAP的权衡

  • 数据冗余:反范式设计通过增加数据冗余来提高查询性能。但在分库分表的场景中,这种冗余可能导致CAP权衡的复杂性增加。

一致性(Consistency)问题

  • 强一致性挑战:在分布式系统中,强一致性意味着所有节点在任何时候都看到相同的数据。然而,反范式设计引入的数据冗余可能导致在更新数据时,不同节点上的数据副本之间出现不一致。

  • 分布式事务的影响:为了保持数据的一致性,可能需要使用分布式事务来确保所有相关的数据副本都得到更新。然而,分布式事务的复杂性(如跨库事务、两阶段提交等)可能导致性能下降和可用性降低。

可用性(Availability)问题

  • 节点故障的影响:在分库分表的场景中,一个节点的故障可能导致部分数据无法访问。由于反范式设计引入了数据冗余,一个节点的故障可能影响到多个数据副本的可用性。

  • 维护数据一致性的代价:为了确保数据的一致性,可能需要采取额外的措施(如分布式锁、数据同步等),这些措施可能会降低系统的可用性。

分区容错性(Partition tolerance)问题

  • 网络分区的影响:在分布式系统中,网络分区是一个常见的问题。当网络分区发生时,系统需要能够继续运行并服务请求,即使部分节点之间无法通信。

  • 数据一致性与分区容错的权衡:在发生网络分区时,系统需要在一致性和可用性之间做出权衡。如果系统选择强一致性,可能会阻止写入操作直到所有节点都更新完成,这可能导致可用性降低。相反,如果系统选择可用性,可能会允许写入操作在部分节点上成功,但可能导致数据不一致。

解决方案和策略

  • 最终一致性:对于性能要求高但对一致性要求不高的系统,可以采用最终一致性策略。即不苛求系统的实时一致性,而是在允许的时间段内达到最终一致性。

  • 数据同步和补偿机制:为了保持数据的一致性,可以建立数据同步和补偿机制。例如,使用消息队列或日志来记录数据变更,并在后台异步地同步数据副本。

  • 分布式锁和协调服务:使用分布式锁和协调服务(如ZooKeeper、Etcd等)来协调不同节点之间的数据访问和更新操作,以确保数据的一致性。

2.3、使用场景权衡思考

数据库的范式设计与反范式设计各有其优点和适用场景。在选择使用哪种设计时,需要根据具体的业务需求、数据冗余情况、查询效率以及更新操作的频率等因素进行综合考虑。一般来说,如果业务场景对查询性能有较高要求且可以接受一定程度的数据冗余,那么反范式设计可能是一个不错的选择。而如果业务场景对数据的准确性和一致性有严格要求且希望减少数据冗余和维护成本,那么范式设计可能更为合适。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android Studio main,xml 视图代码转换

Android Studio main,xml 视图&&代码转换 其实很简单,但是对我们小白来说还是比较蒙的。 废话不多说,直接上图。 我的Android Studio 是 4.0 版的 我刚打开是这个界面,在我想学习如何用代码来布局,可能大家也会找不见代码的位置。 follow me 是不是感觉很简单呢。…

基于DE2-115平台的VGA显示实验

一.任务需求 深入了解VGA协议,理解不同显示模式下的VGA控制时序参数(行频、场频、水平/垂直同步时钟周期、显示后沿/前沿等概念和计算方式);通过Verilog编程,在至少2种显示模式下(64048060Hz,102476875Hz&…

Day14——Python文本挖掘数据分析

文章目录 竞争分析-品类分布-适用对象竞争分析-产品结构-拜耳在这里插入图片描述竞争分析-产品结构-拜耳-BCG图竞争分析-产品结构-拜耳-明星竞争分析-产品结构-拜耳-奶牛竞争分析-产品结构-拜耳-问题竞争分析-产品结构-安速-BCG图竞争分析-产品结构-安速-明星竞争分析-产品结构…

vue3项目使用Electron打包成exe的方法与打包报错解决

将vue3项目打包成exe文件方法 一、安装 1.安装electron npm install electron --save-devnpm install electron-builder --save-dev 2.在vue项目根目录新建文件index.js // index.js// Modules to control application life and create native browser window const { app…

Python日志管理利器:如何高效管理平台日志

一、为什么需要日志管理? 日志是应用程序的重要组成部分,它记录了应用程序的运行状态、错误信息以及用户交互等关键信息。良好的日志管理可以帮助开发人员及时发现和解决问题,提高应用程序的稳定性和可靠性。 项目在本地开发调试时&#xf…

AGI的多模态融合

在人工智能的宏伟蓝图中,人工通用智能(AGI)代表着一个集大成者,一个能够理解、学习、适应并执行任何智能任务的系统。随着我们对AGI的探索愈发深入,尤其是在视觉、语言和其他模态的融合上,关于AGI的讨论愈发…

详解DAC数模转换+DAC输出模拟电压的测量比对实验程序

前言:详解DAC数模转换原理DAC输出模拟电压的测量比对实验程序(使用 DAC 通道 1 输出模拟电压,然后通过 ADC1 的通道 1 对该输出电压进行读取,并显示在 LCD 模块上面,DAC 的输出电压可以通过按键(或 USMART&…

PostgreSQL的学习心得和知识总结(一百四十五)|深入理解PostgreSQL数据库之ShowTransactionState的使用及父子事务有限状态机

目录结构 注:提前言明 本文借鉴了以下博主、书籍或网站的内容,其列表如下: 1、参考书籍:《PostgreSQL数据库内核分析》 2、参考书籍:《数据库事务处理的艺术:事务管理与并发控制》 3、PostgreSQL数据库仓库…

Kubernetes部署Kanboard看板管理平台

【云原生】Kubernetes部署Kanboard项目管理平台 文章目录 【云原生】Kubernetes部署Kanboard项目管理平台介绍资源列表基础环境一、检查k8s环境1.1、检查工作节点状态1.2、检查系统pod状态 二、编辑kanboard.yaml文件2.1、创建项目目录2.2、编辑kanboard.yaml文件 三、部署Kanb…

Hadoop三大组件原理详解:hdfs-yarn-MapReduce(第9天)

系列文章目录 一、HDFS读写原理【重点】 二、YARN提交mr流程【重点】 三、MapReduce计算流程【重点】 文章目录 系列文章目录前言一、HDFS读写原理[面试]1、HDFS数据写入解析2、HDFS数据读取解析 二、YARN提交mr流程[面试]1. YARN提交mr过程解析 三、MapReduce计算流程[面试]1…

探索监管沙箱在金融科技行业中的应用

一、引言 随着金融科技的快速发展,传统金融机构与科技企业之间的竞争也日趋激烈。为了平衡金融科技创新与风险防控,各国监管机构纷纷引入监管沙箱(Regulatory Sandbox)机制。监管沙箱作为一个受监督的安全测试区,允许金…

MySQL 面试突击指南:核心知识点解析1

MySQL中有哪些存储引擎? InnoDB存储引擎 InnoDB是MySQL的默认事务型引擎,也是最重要、使用最广泛的存储引擎,设计用于处理大量短期事务。 MyISAM存储引擎 在MySQL 5.1及之前版本,MyISAM是默认的存储引擎。它提供了全文索引、压缩、空间函数(GIS)等特性,但不支持事务和…

台积电(TSMC)正在探索采用新型先进芯片封装技术

台积电(TSMC)正在探索采用新型先进芯片封装技术,使用类似面板的矩形基板,以应对日益增长的先进多芯片组处理器需求。据日经亚洲报道,这项开发仍处于早期阶段,可能需要数年时间才能商业化,但如果…

Python酷库之旅-第三方库openpyxl(01)

目录 一、 openpyxl库的由来 1、背景 2、起源 3、发展 4、特点 4-1、支持.xlsx格式 4-2、读写Excel文件 4-3、操作单元格 4-4、创建和修改工作表 4-5、样式设置 4-6、图表和公式 4-7、支持数字和日期格式 二、openpyxl库的优缺点 1、优点 1-1、支持现代Excel格式…

【C语言 || 数据结构】二叉树

文章目录 前言 二叉树1.树1.1树的定义1.2 树的结构 2.特殊的树(二叉树)2.1 二叉树的概念2.2 特殊的二叉树2.3 二叉树的储存2.3.1 顺序储存二叉树2.3.2 链表储存二叉树 2.4 二叉树的遍历2.4.1 二叉树的中序遍历2.4.2 二叉树的前序遍历2.4.3 二叉树的后序遍…

【React】使用Token做路由权限控制

在components/AuthRoute/index.js中 import { getToken } from /utils import { Navigate } from react-router-domconst AuthRoute ({ children }) > {const isToken getToken()if (isToken) {return <>{children}</>} else {return <Navigate to"/…

Solr9 如何使用 DIH 读取数据库索引数据

使用 Solr 9 中的数据导入处理程序&#xff08;DIH&#xff09; DIH&#xff08;Data Import Handler&#xff09;提供了一种可配置的方式向 Solr 中导入数据。 从 Solr 9 开始&#xff0c;数据导入处理程序&#xff08;DIH&#xff09;已经不再直接包含在 Solr 中&#xff0c…

【Linux】关于在华为云中开放了端口后仍然无法访问的问题

已在安全组中添加规则: 通过指令: netstat -nltp | head -2 && netstat -nltp | grep 8080 运行结果: 可以看到服务器确实处于监听状态了. 通过指令 telnet 公网ip port 也提示: "正在连接xxx.xx.xx.xxx...无法打开到主机的连接。 在端口 8080: 连接失败"…

[WTL/Win32]_[中级]_[MVP架构在实际项目中的应用]

场景 在开发Windows和macOS的界面软件时&#xff0c;Windows用的是WTL/Win32技术&#xff0c;而macOS用的是Cocoa技术。而两种技术的本地语言一个主打是C,另一个却是Object-c。界面软件的源码随着项目功能增多而增多&#xff0c;这就会给同步Windows和macOS的功能造成很大负担…

数据驱动制造:EMQX ECP 指标监测功能增强生产透明度

迈向未来的工业生产&#xff0c;需要的不仅是自动化&#xff0c;更是智能化。如果工业企业的管理者能够实时监测每一生产环节的设备运行状态&#xff0c;每一数据点位情况&#xff0c;洞察和优化每一步生产流程&#xff0c;他们将能够做出更精准的决策&#xff0c;提高生产效率…