关于“数据完全版本记录”的系统设计

news2024/11/14 15:04:23

时间:2024年08月24日

作者:小蒋聊技术

邮箱:wei_wei10@163.com

微信:wei_wei10

音频:https://xima.tv/1_Gtthca?_sonic=0

希望大家帮个忙!如果大家有工作机会,希望帮小蒋内推一下,小蒋希望遇到一个认真做事的团队,一起努力。需要简历可以加我微信。

大家好,欢迎来到小蒋聊技术,小蒋准备和大家一起聊聊技术的那些事。

今天小蒋准备和大家一起聊的这个技术就厉害了!那就是“数据中的完全版本记录”设计。

昨天小蒋和大家一起分析了一个证券交易系统中的一个ER图。这个时候,有一个新的需求:请记录“数据中的完全版本记录”,小蒋来试着分析一下。

当业务要求数据有完全版本记录时,系统需要确保每一笔数据变更都被详细记录下来,这样不仅可以在出现问题时回溯,还可以满足合规性和风险管理的需求。通常在金融和证券交易系统,医疗信息系统,交易支付系统,都会有这样的要求。这些系统对数据的准确性、可追溯性以及合规性有着严格的要求。为了实现这一目标,数据模型需要能够支持以下功能:

  1. 所有数据变更的记录和追踪:每次数据的更新、插入或删除操作都需要被记录,并保留每一个版本的数据。
  2. 高效的查询和数据恢复能力:系统必须能够高效地查询历史数据,并能够在必要时恢复到指定的历史状态。
  3. 性能优化:在高并发环境下,系统应尽量减少记录数据变更对性能的影响。

数据模型设计

核心业务表和历史记录表设计

我们在系统里基于ER图中的核心业务表(这些是原有的表),并为数据的完全版本记录引入了历史记录表。以下是具体设计:

核心业务表(ER图中的原有表)

  • BOND_TR :记录债券交易的核心信息,包含每一笔交易的最新数据。
    • 字段
      • TradeId: 交易唯一标识,作为主键,用于标识每笔交易。
      • 其他字段:如交易类型、交易金额、交易时间等,存储最新的交易数据。
  • BOND :记录债券的详细交易信息,包括债券的种类、金额、期限等。
    • 字段
      • BondId: 债券唯一标识,作为主键。
      • TradeId: 外键,引用 BOND_TR 表中的 TradeId,用于关联具体的交易记录。
  • BD_PTSETL :记录交易的结算信息,保存结算金额、日期等关键数据。
    • 字段
      • SettleId: 结算唯一标识,作为主键。
      • TradeId: 外键,引用 BOND_TR 表中的 TradeId。

历史记录表(新增的表)

为了确保每次数据变更都被保存,我们引入以下历史记录表。这些表专门用于记录每次数据修改前的状态,保留所有版本的信息:

  • BOND_TR_History
    • 用途:存储 BOND_TR 表的历史版本。每次 BOND_TR 表中的数据发生变更时,旧版本会被复制到这个表中。
    • 字段
      • TradeId: 交易唯一标识,引用 BOND_TR 表中的 TradeId。
      • VersionNumber: 版本号,每次修改后递增,确保每个版本的数据唯一。
      • IsCurrent: 标识当前版本是否为最新版本(True 表示当前版本,False 表示历史版本)。
      • EffectiveDate: 版本生效时间,标识该版本数据何时生效。
      • EndDate: 版本结束时间,标识该版本何时被新的版本取代。

解释:

  • CreateTime 记录的是数据的创建时间,也就是第一次写入数据库的时间点。
  • EffectiveDate 则记录的是某个版本的数据开始生效的时间,通常在数据被修改时更新。

所以,尽管两个字段都涉及时间信息,但 EffectiveDate 是版本控制中的时间概念,而 CreateTime 是记录创建时的时间概念,它们的意义在数据生命周期中各有侧重,不可互换。

  • BOND_History
    • 用途:存储 BOND 表的历史版本。记录每次债券信息的变化。
    • 字段
      • BondId: 债券唯一标识,引用 BOND 表中的 BondId。
      • TradeId: 外键,引用 BOND_TR_History 表中的 TradeId。
      • VersionNumber: 版本号,和 BOND_TR_History 表中的 VersionNumber 保持同步。
      • IsCurrent: 标识当前版本是否为最新版本。
      • EffectiveDate: 版本生效时间。
      • EndDate: 版本结束时间。
  • BD_PTSETL_History
    • 用途:存储 BD_PTSETL 表的历史版本,确保所有结算信息的变化都能被追溯。
    • 字段
      • SettleId: 结算唯一标识,引用 BD_PTSETL 表中的 SettleId。
      • TradeId: 外键,引用 BOND_TR_History 表中的 TradeId。
      • VersionNumber: 版本号,与 BOND_TR_History 表中的 VersionNumber 保持一致。
      • IsCurrent: 标识当前版本是否为最新版本。
      • EffectiveDate: 版本生效时间。
      • EndDate: 版本结束时间。

设计细节的深入优化

为了确保数据完全版本记录模型在高并发场景下的有效性和性能,我们还需要进一步优化设计:

1. 乐观锁机制

为了确保数据一致性,我们采用乐观锁机制。在数据更新时,系统会检查当前记录的版本号是否匹配,如果版本号一致,则允许更新;如果版本号不一致,说明有其他操作修改过数据,这时系统会拒绝更新并提示用户重新提交。

2. 分区与分表策略

为了优化历史记录表的性能,我们可以按时间段(如季度或年度)对历史记录表进行分区,这样可以减少单个表的数据量,提升查询和写入效率。此外,对于数据量巨大的表,我们还可以采用分表策略,将数据按业务类型或其他规则分散存储在不同的表中。

3. 异步处理与缓存机制

为了降低历史数据写入对系统主业务流程的影响,我们可以使用异步处理机制。通过消息队列(如 Kafka)将旧版本数据发送到后台处理模块,异步写入历史记录表。这样主线程不必等待历史数据写入完成,可以提高系统响应速度。同时,使用 Redis 等缓存系统来存储常用的查询结果,可以进一步减轻数据库压力。

4. 异常情况下的数据一致性保证

使用异步处理机制时,最重要的是在异常情况下如何保证数据的一致性。我们可以通过以下方法来确保这一点:

  • 事务管理与回滚机制:通过将异步处理纳入事务管理,确保主事务提交时,异步任务也成功执行。如果异步处理失败,可以触发回滚机制,保持数据的一致性。
  • 消息队列的确认机制:像 Kafka 这样的消息队列提供了确认机制,只有当消息被成功处理后,才会被标记为“已消费”。如果处理失败,消息会保留在队列中等待重新处理。
  • 幂等性设计:确保异步操作具有幂等性,即多次执行同一操作不会影响最终结果。通过在写入历史数据时检查是否已经存在相同的版本,避免重复写入,从而确保数据一致性。
  • 定期数据对账与补偿机制:通过定期对账,检查主业务表与历史记录表之间的数据是否一致。如果发现不一致,可以通过补偿机制重新处理未成功的操作。

5. 短事务管理与批量处理

在高并发环境下,短事务管理非常重要。尽量缩短每个事务的生命周期,减少数据库锁的持有时间,降低并发操作之间的冲突。同时,对于大量的数据更新操作,可以使用批量处理的方式,减少数据库连接和提交的开销,从而提升系统的整体性能。

总结

通过以上深入的设计,我们可以在确保系统高效运行的同时,满足数据完全版本记录的业务需求。这个数据模型设计能够为系统提供强大的数据追溯能力,并确保在高并发环境下的稳定性和性能表现。通过乐观锁机制、分区与分表、异步处理和短事务管理等策略,我们能够有效管理数据的历史版本,同时保持系统的高效性和可靠性。尤其在异常情况下,通过事务管理、消息队列确认、幂等性设计和补偿机制,我们可以确保数据的一致性,进一步提升系统的可靠性。

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

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

相关文章

[运算放大器系列]四、PT100和热电偶采集电路分析

[运算放大器系列]三、PT100和热电偶采集电路分析 1. 前言2. 电路原理图3. 热电偶电路4. 三线热电阻电路 1. 前言 淘宝偶然发现一款可以支持热电阻和热电偶多种传感器的温度变送器 , 从图上看重要的芯片丝印都磨掉了。 2. 电路原理图 在其他网站上搜到两篇关于该设备的帖子 …

理解 HarmonyOS 中的网格布局:综合指南

网格布局是创建响应式和结构化用户界面的强大工具。通过将界面划分为由行和列组成的单元格,网格可以精确控制组件的分布和对齐。这使得它们成为各种应用程序(例如图库、日历和计算器)的理想选择。 在 HarmonyOS 中,ArkUI 提供了用…

代码随想录算法训练营day30 | 贪心算法 | 452.用最少数量的箭引爆气球、435.无重叠区间、763.划分字母区间

文章目录 452.用最少数量的箭引爆气球思路 435.无重叠区间思路 763.划分字母区间思路问题的转化 总结 今天是贪心算法专题的第四天,今天的三道题目,都算是 重叠区间 问题,大家可以好好感受一下。 都属于那种看起来好复杂, 但一看…

携手共创商业新纪元,聚贤国际成都分部正式成立

成大事者,聚于府都。2024年8月10日,在成都这个西部经济中心城市,聚贤国际成都分部正式成立,标志着聚贤国际商会在这片营商沃土落地生根。 本次成都分部成立,特别邀请到聚贤国际创始人刘芒芒及聚贤国际商会三亚分部、海…

ubuntu20.04源码编译安装qemu(qemu8.2)

ubuntu20.04源码安装qemu8.2 本文用于记录在ubuntu20中源码编译安装qemu8.2,同时也希望能够对你有所帮助。 一、download qemu 根据自己的需求下载对应版本的qemu源码压缩包。 https://github.com/qemu/qemu/tags二、build qemu 解压缩后,执行下述命令。…

一文读懂高通GPU驱动渲染流程

1. gpu command分析 1.1 gpu command概述 SM8650平台上,GLES发送给KMD(GPU驱动)的GPU命令有两种类型:同步命令和绘制命令。 绘制命令,一般都是一个个的drawcall组成的,是真正GPU程序指令,KMD会给…

自动分班实用工具

开学前夕,老师们的日程表上又添上了一笔笔的工作任务。分班,作为开学前的一项重要工作,不仅关系到学生的学习环境,也是家长们关注的焦点。 易查分,让分班变得简单 易查分小程序的出现,为老师们提供了一种全…

Vercel 的 AI 工具 V0.dev:如何使用它?

几个月前,Vercel 宣布推出了 V0.dev,这是一款专为开发人员和设计师设计的工具,能够使用 AI 生成 React 代码。最初,V0.dev 对外开放时采用了邀请制,但如今拥有 Vercel 帐户的任何人都可以访问并使用它。 这些工具填补…

计算机专业的 “铁饭碗” 终于被发现啦

计算机专业毕业后只能当码农吗?大错特错❌!其实计算机专业考公真的非常有优势呢!张雪峰就曾说过:“计算机在考公的时候,有那种 yyds 的感觉,是所有单位都要。”😃 🌻计算机类专业包…

音频播放+音频采样(绘制音波)

引言 在 iOS 平台中,实现音频播放有多种方式。AVAudioPlayer 是一个专门用于播放音频数据的类,易于使用,适合处理简单的音频播放需求。而 AVPlayer 则是一种更通用的播放器,既能播放视频资源,也能处理音频内容&#x…

Linux:Linux线程池

目录 线程池的概念 线程池的优点 线程池的应用场景 线程池的实现 线程池演示 线程池的概念 线程池是一种线程使用模式。 线程过多会带来调度开销,进而影响缓存局部和整体性能,而线程池维护着多个线程,等待着监督管理者分配可并发执行的…

长视频生成研究的挑战、方法与前景

人工智能咨询培训老师叶梓 转载标明出处 长视频生成面临的主要挑战包括如何在有限的计算资源下生成长时间、高一致性、内容丰富且多样化的视频序列。另外现有研究中对于“长视频”的定义并不统一,这给研究的标准化和比较带来了困难。来自西安电子科技大学、上海交通…

Window 安装Gogs教程

1、下载 下载地址:https://gogs.io/docs/installation/install_from_binary.html(请自行科学上网 选择Windows amd64(64位)或者386(32位) 2、安装 2.1 将压缩文件放到目标文件夹 2.2 创建数据库 在本地数据库或者其他目标数据库新建查询执行下列SQL语句 找到go…

taskBus的设计局限和吞吐能力测试

在前文中,我们介绍了EPDR技术的起源,以及使用该技术驱动的业余软件无线电平台专栏。已有玩家通过踩坑证明,进程管道交换数据时间延迟大(10ms),构造时间敏感系统难。除非采用传统的紧耦合设计及更大的颗粒度…

尚品汇-选中状态缓存变更、删除缓存购物车(三十八)

目录: (1)选中状态的变更 (2)删除购物车 (3)流程总结 (1)选中状态的变更 用户每次勾选购物车的多选框,都要把当前状态保存起来。由于可能会涉及更频繁的操…

基于AT89C51单片机的可手动定时控制的智能窗帘设计

点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/89469560?spm=1001.2014.3001.5503 C 源码+仿真图+毕业设计+实物制作步骤+11 摘要 I abstract II 第1章 绪论 1 1.1 背景及意义 1 1.2 国内外发展现状 1 1.3 设计思想及基…

ChatGPT等大模型高效调参大法——PEFT库的算法简介

随着ChatGPT等大模型(Large Language Model)的爆火,而且目前业界已经发现只有当模型的参数量达到100亿规模以上时,才能出现一些在小模型无法得到的涌现能力,比如 in_context learing 和 chain of thougt。深度学习似乎…

Excel如何快速的定位到某一列和快速知道当前列

Excel如何快速的定位到某一列和快速知道当前列 背景快速找到某一列---660列快速知道当前列 背景 由于某一次做excel数据太大需要快速知道某一列是多少列和快速定位到某一列对此写了这个 快速找到某一列—660列 SUBSTITUTE(ADDRESS(1, 660, 4), "1", ""…

实现MySQL的主从复制基础

目录 1 MySQL实现主从复制的原理 1.1 实现主从复制的规则 1.2 如何实现主从复制 2 MySQL 实现主从复制实践 2.1 实验环境 2.2 my.cnf 配置添加 2.2.1 配置MSTER 端配置文件 2.2.2 配置SLAVE 端配置文件 2.2.3 三台MySQL服务器重启服务 2.3 创建用于复制的用户 2.4 保证三台主机…

Android实战:过root检测

在启动这个app时,我们会看到一个提示,表示设备处于root环境。如下图所示: 为了过掉到这个root检测,我们可以通过直接Hook Toast.show()方法,并打印调用堆栈信息来实现定位关键代码。以下是相关的Frida脚本代码&#…