一个证券交易系统的设计

news2024/9/25 15:26:22

时间:2024年08月25日

作者:小蒋聊技术

邮箱:wei_wei10@163.com

微信:wei_wei10

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

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

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

今天小蒋准备和大家一起聊的这个技术就厉害了!那就是一个证券交易系统的设计。

1. 提出原因或需求

在现代证券交易系统中,满足以下需求至关重要:

  • 数据的完全版本记录:每一次数据的变更都必须被详细记录,以确保合规性和审计能力。
  • 前端的灵活性:系统需要支持前端随时根据业务需求增加新的业务字段,而不需要对系统的核心结构进行大规模重构。
  • 系统的可扩展性:后端必须能够动态处理和存储新增加的字段,确保系统能够快速适应业务需求的变化。

2. 数据模型设计:支持完全版本记录

业务需求:为了满足业务需求,所有数据变更必须有完整的版本记录,允许追溯历史版本。

数据模型设计方案

  1. 版本控制的数据模型设计
    • 主数据表与历史版本表
      • 主表:ER图中的核心实体(例如BOND)记录当前最新的数据版本。
      • 历史版本表:例如BOND_HISTORY表,记录所有历史版本数据。
      • 字段设计
        • VersionNo:版本号,用于标识每次变更的数据版本。
        • IsActive:标识当前记录是否为最新版本。
        • EffectiveDate 和 EndDate:记录版本的生效和结束日期。
    • 版本管理逻辑
      • 每次修改核心实体表中的数据时,旧版本会被存入历史表,并更新EndDate字段。
      • 新版本的记录会更新到核心实体表中,并生成一个新的VersionNo,设置IsActive为1。

3. 前端结合设计:数据栏位、校验与数据生命周期处理

数据栏位设计

  • 核心业务字段:在前端,核心实体(如BOND)中的主要字段通过表单控件展示给用户,如BondName、TradeId等。
  • 版本控制字段:VersionNo、IsActive等版本控制字段不会直接展示给用户,但在查看历史版本时,可以以只读模式显示。
  • 动态扩展字段
    • 动态生成:使用前端框架(如React、Vue.js)动态生成新增字段的输入控件。例如,通过API获取配置,动态生成所需的文本框、下拉菜单等。

整体校验设计

  • 前端校验
    • 必填字段校验:前端使用required属性或自定义脚本,确保用户填写所有必填字段。未填写时,给予即时反馈(如高亮显示或提示信息)。
    • 数据类型校验:使用HTML5的内置校验功能(如type="email"、type="number")或自定义校验函数,确保用户输入符合预期类型。
    • 格式校验:对于特定格式的字段(如日期、金额),前端通过正则表达式或特定的输入控件进行格式校验。
    • 逻辑校验:确保数据之间的逻辑关系正确,如EndDate必须晚于EffectiveDate。
  • 后端校验
    • 复杂业务逻辑校验:后端负责对提交的数据进行深入的业务逻辑校验,以确保数据的准确性和合法性。
    • 并发控制:使用乐观锁或其他机制,确保高并发下数据的一致性。

数据生命周期处理

  • 版本管理
    • 前端处理:用户提交修改时,前端显示当前版本信息,并提示用户变更的版本号。
    • 后端处理:后端生成新版本并将旧版本归档至历史表,管理EffectiveDate和EndDate字段。
    • 版本历史查看:前端通过API调用后端的历史数据接口,展示历史版本信息。
  • 审批与归档
    • 前端处理:在需要审批的流程中,前端会显示当前的审批状态,并禁止用户进一步修改,直到审批完成。
    • 后端处理:后端执行审批流程,更新数据状态,并在必要时将数据归档。
  • 自定义生命周期动作
    • 前端触发:用户可以通过前端界面触发特定的生命周期操作(如重新审核、数据恢复等)。
    • 后端执行:后端接收前端的触发请求后,执行具体的生命周期管理操作,例如,重新激活归档数据、更新状态等。

4. 实体的扩展与定制

实体扩展的设计思路

  1. 使用EAV模型(Entity-Attribute-Value

EAV模型的核心思想

  • 灵活性:EAV模型的核心目的是提供极大的灵活性,允许在同一个表中存储不同实体的各种属性,而这些属性可能是动态的、可变的,并且可能在不同实体之间有所差异。

实现步骤

  • 创建属性表:例如,为Bond实体创建BondAttributes表,结构如下:
    • EntityId:指向实体主表的外键,例如BondId。
    • AttributeName:属性名称,如RiskLevel、MarketSegment。
    • AttributeValue:属性值,通常为字符串或其他通用数据类型。

应用场景

  • 广泛应用场景:适用于需要存储大量不同属性,而这些属性可能是稀疏的或频繁变化的场景。例如,一个产品可能有“颜色”和“尺寸”,另一个产品可能有“电池容量”和“屏幕大小”。

优点

  • 高度灵活:可以动态增加属性而无需修改数据库结构。
  • 适应变化:适合那些数据结构变化频繁或不同实体属性各异的场景。

缺点

  • 复杂性增加:由于属性和值存储在不同的记录中,查询和操作可能变得更为复杂,特别是在需要对多个属性进行筛选时。
  1. 使用JSON字段存储

JSON存储的核心思想

  • 嵌套数据存储:在主表中使用JSON字段存储扩展属性,可以灵活存储多层次、复杂结构的数据。

实现步骤

  • 新增JSON字段:在BOND表中增加AdditionalData字段,类型为JSON,示例结构如下:
{

  "RiskLevel": "High",

  "MarketSegment": "EMEA",

  "CustomAttributes": {

    "Attribute1": "Value1",

    "Attribute2": "Value2"

  }

}
  • 前后端处理
    • 前端:在表单提交或展示时,解析和构建JSON数据。
    • 后端:处理JSON数据,确保其符合业务逻辑需求。

优点

  • 灵活性高:可以在一个字段中存储多层次、不同类型的复杂数据结构。
  • 适合嵌套数据:特别适用于存储嵌套或关联属性的数据。

缺点

  • 性能影响:虽然灵活性高,但在进行查询、筛选和排序时,性能可能不如传统结构化数据。
  1. 使用属性表关联模式

属性表关联模式的核心思想

  • 分离属性管理:为每个需要扩展的实体创建单独的属性表,与主实体通过外键关联,集中管理所有扩展属性。

实现步骤

  • 创建关联表:例如,为Bond实体创建BondAttributes表,结构如下:
    • AttributeId:属性的唯一标识符。
    • BondId:关联到主实体表的外键(例如BOND表)。
    • AttributeName:属性名称。
    • AttributeValue:属性的具体值。

应用场景

  • 专用扩展:属性表关联模式更专注于为特定实体扩展额外的属性,通常这些属性是与业务逻辑紧密相关的,且属性的数量和类型是相对确定的。

优点

  • 清晰管理:结构清晰,易于理解和维护,特别适用于属性数量适中、变化频率中等的场景。
  • 性能较好:相较于EAV模型,查询性能可能较优,尤其是在属性数量有限的情况下。

缺点

  • 灵活性受限:相比于EAV和JSON存储,在属性多样性和扩展性上略显不足。

5. 校验与自动填充

校验与自动填充的扩展设计

在属性需要扩展的情况下,系统需要具备以下能力,以确保新增属性的数据质量和一致性。

1. 前端校验与自动填充

前端校验的设计

  • 动态校验规则
    • 配置驱动的校验:当新增属性时,前端可以通过配置文件或API动态加载校验规则。比如,针对某个新增的RiskLevel属性,可以设置格式(如数字格式)、范围(如0-100)的校验。
    • 正则表达式校验:前端根据属性类型使用正则表达式对用户输入进行即时校验。例如,日期字段使用yyyy-mm-dd格式校验。

自动填充的设计

  • 基于依赖关系的自动填充
    • 属性依赖关系:某些属性可能依赖于其他属性的值。例如,选择了BondType后,系统可以自动填充默认的RiskLevel或其他关联属性。前端可以根据用户选择动态调整或自动填充这些属性。

前端UI动态生成

  • UI组件动态生成
    • 根据属性类型生成控件:根据属性的数据类型(如字符串、日期、数字),动态生成相应的输入控件(如文本框、日期选择器、下拉列表),并自动附加校验逻辑。

2. 后端校验与自动填充

后端校验的设计

  • 多层次校验逻辑
    • 属性类型校验:后端需要根据属性的类型进行数据类型校验,例如验证日期格式的正确性或数值的范围。
    • 业务逻辑校验:如在提交时验证MaturityDate是否晚于IssueDate,或者RiskLevel是否在合理的范围内。

自动填充的设计

  • 规则驱动的自动填充
    • 基于业务规则的自动填充:后端在处理请求时,可以根据业务规则为某些属性自动生成默认值或计算值。例如,当用户提交一个BondType时,系统可以根据预定义规则自动填充其相关的RiskLevel。

持久化动态属性

  • 灵活存储方案
    • JSONEAV存储:新增的动态属性可以通过JSON字段或EAV模型进行存储,后端在接收到前端数据后,解析并根据业务规则进行存储和处理。

6. 数据生命周期管理的定制

前端触发与后端执行

  • 用户操作:前端允许用户触发特定的生命周期动作,如数据归档、状态更新等。用户可以通过按钮或操作菜单选择这些动作。
  • 后端处理:后端根据用户的操作请求,执行相应的业务逻辑。例如,当用户选择“归档”操作时,系统会自动将数据移入归档表,并更新状态字段。

定期任务与事件驱动

  • 定期任务:后端可以设置定期任务,如每天自动检查并处理达到归档条件的数据。可以使用任务调度器或定时任务服务来实现。
  • 事件驱动:在业务逻辑中添加事件触发机制。例如,当MaturityDate到达时,系统自动触发状态更新或通知用户进行进一步操作。

7. 基于生命周期动作定制的实体扩展

当业务要求对数据的生命周期动作进行定制时,实体的扩展需要支持动态状态管理、事件驱动和定期任务处理。以下是如何根据这些需求设计系统。

1. 使用状态机模式管理生命周期

状态机的核心思想

  • 状态与动作:使用状态机模式来管理实体的生命周期。每个实体都有多个可能的状态,每个状态可以触发不同的动作或导致状态转换。

实现步骤

  • 状态字段:在核心实体表中增加Status字段,用于标识当前生命周期状态。
  • 状态机配置:定义一个StateMachine配置表,用于存储状态转换规则和对应的生命周期动作。例如:
    • CurrentState:当前状态(如Active、Matured)。
    • NextState:下一状态(如Archived)。
    • Action:触发的动作(如SendNotification、GenerateReport)。
    • Condition:状态转换条件(如MaturityDate到达)。

应用场景

  • 自动化流程管理:当某个条件满足时,系统自动根据状态机规则更新实体的状态,并执行相应的动作。例如,当债券到期时,状态从Active转换为Matured,系统自动生成到期报告并通知相关方。

优点

  • 灵活性:状态机模式可以轻松配置和扩展,适应多变的业务需求。
  • 可维护性:清晰的状态和动作定义,使得系统逻辑易于理解和维护。

2. 使用事件驱动架构

事件驱动架构的核心思想

  • 基于事件触发动作:使用事件驱动架构来响应数据生命周期中的关键事件,例如状态变更、数据更新或条件满足。

实现步骤

  • 事件日志表:创建一个EventLog表,用于记录和管理系统中的关键事件。
    • EventId:事件的唯一标识符。
    • EntityId:关联的实体ID,例如BondId。
    • EventType:事件类型,例如MaturityReached。
    • Timestamp:事件发生时间。
    • Processed:事件是否已被处理。
  • 事件处理器:实现事件处理逻辑,根据事件类型触发相应的生命周期动作。例如,当MaturityReached事件被触发时,系统自动执行相应的归档操作。

应用场景

  • 事件触发动作:当特定事件发生时,系统可以立即响应并执行相应的动作,例如发送通知、归档数据或更新状态。

优点

  • 实时性:事件驱动架构能够实时响应并处理系统中的关键事件。
  • 扩展性:通过增加新的事件类型和处理器,系统可以轻松扩展和适应新的业务需求。

3. 使用定期任务和批处理

定期任务的核心思想

  • 定时检查与处理:使用定期任务来周期性地检查数据的生命周期状态,并执行相应的操作。

实现步骤

  • 任务调度:使用任务调度器(如Quartz或内置的定时任务服务)来定期执行任务。
    • 定期任务可以检查即将到期的债券,并将其状态更新为Matured,然后触发相应的生命周期动作。
  • 批处理作业:对于需要大量数据处理的操作(如批量归档、数据清理),可以通过批处理作业来执行,避免实时处理带来的性能影响。

应用场景

  • 定期归档:每天夜间系统会自动检查到期的债券,并将其归档到历史表中。
  • 数据清理:定期清理无效或过期的数据,确保系统的高效运行。

优点

  • 效率高:定期任务适合处理大批量数据,降低系统的实时负载。
  • 稳定性:通过批处理减少高峰时段的负载,确保系统稳定性。

总结

在本次详细的设计方案中,我们不仅涵盖了如何在证券交易系统中实现数据的完全版本记录、前端结合设计、数据生命周期管理,还深入探讨了如何扩展实体以支持属性扩展下的校验与自动填充,以及数据生命周期动作的定制。

通过结合动态校验、自动填充逻辑、状态机管理、事件驱动架构和定期任务管理,系统能够灵活地处理各种定制化的数据生命周期动作。这种设计不仅能适应复杂的业务流程,还能随着业务的变化而灵活调整,为构建一个智能、高效且可扩展的证券交易系统提供了坚实的技术基础。如果有进一步的需求或问题,欢迎继续探讨!

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

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

相关文章

墨者学院 手工注入题解(oracle数据库)

简介 Oracle 数据库系统,是美国ORACLE公司(甲⻣⽂)提供的以分布式数据库为核⼼的⼀组软件 产品。是⽬前世界上使⽤最为⼴泛的,数据库管理系统。 以下是手工注入的流程: 1、判断注入点 使用 and 11 进行拼接 2、确定…

C语言-实参和形参数据传递的特点及使用技巧

&#x1f30f;个人博客&#xff1a;尹蓝锐的博客 引言&#xff1a; 在我们介绍实参和形参数据传递的特点及使用技巧之前&#xff0c;我们先拿一个有关值传递的典型错误案例来剖析一下。 典型错误举例&#xff1a; #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h&g…

学习笔记——TypeScript

文章目录 介绍TS增加类型支持的原因&#xff1a;安装typescript运行TS文件TS常用类型类型标注位置字符串类型、数字类型、布尔类型字面量类型interface类型class类 总结 开发阶段规范代码&#xff0c;使代码更严谨 介绍 TypeScript&#xff08;简称&#xff1a;TS&#xff09;…

《操作系统---PV操作》(同步与互斥)

一、练习题 面包师有很多面包&#xff0c;由n名销售人员推销。每名顾客进店后按序取一个号&#xff0c;并且等待叫号&#xff0c;当一名销售人员空闲时&#xff0c;就按序叫下一个号。可以用两个整型变量来记录当前的取号值和叫号值&#xff0c;试设计一个使销售人员和顾客同步…

PyTorch深度学习模型训练流程的python实现:回归

回归的流程与分类基本一致&#xff0c;只需要把评估指标改动一下就行。回归输出的是损失曲线、R^2曲线、训练集预测值与真实值折线图、测试集预测值散点图与真实值折线图。输出效果如下&#xff1a; 注意&#xff1a;预测值与真实值图像处理为按真实值排序&#xff0c;图中呈现…

聚合智链已获道富环球投资,正式上线AI合约策略资金托管平台

全球最大的托管银行之一道富环球首次进军加密货币领域&#xff0c;聚合智链获得其投资支持&#xff0c;打造出全球领先的AI合约策略资金托管平台&#xff0c;将在2024年8月 28 日正式上线。 道富环球集团的总部位于美国&#xff0c;其成立于1792年&#xff0c;是一家专注于托管…

easypoi模板导出word多页导出加强版

说明 上一篇文章提到多页导出&#xff0c;但是后边发现一个问题&#xff0c;如果用同一个模板导出多页内容&#xff0c;我们去获取多页内容的时候&#xff0c;会发现全部都一样&#xff0c;举个例子&#xff1a; XWPFDocument document WordExportUtil.exportWord07(outputU…

深度学习入门-第4章-神经网络的学习

学习就是从训练数据中自动获取最优权重参数的过程。引入损失函数这一指标&#xff0c;学习的目的是找出使损失函数达到最小的权重参数。使用函数斜率的梯度法来找这个最小值。 人工智能有两派&#xff0c;一派认为实现人工智能必须用逻辑和符号系统&#xff0c;自顶向下看问题…

java-Mybatis框架

简介 MyBatis 是一款优秀的持久层框架&#xff0c;它支持自定义 SQl、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO&#xff08;Plain Old Java Obje…

DFS 算法:全排列问题

我的个人主页 {\large \mathsf{{\color{Red} 我的个人主页} } } 我的个人主页 往 {\color{Red} {\Huge 往} } 往 期 {\color{Green} {\Huge 期} } 期 文 {\color{Blue} {\Huge 文} } 文 章 {\color{Orange} {\Huge 章}} 章 DFS 算法&#xff1a;记忆化搜索 此系列更新频繁&…

k8s中service对象

文章目录 一、Service简介Service和kube-proxy的作用与区别Service的工作过程kube-proxy的工作过程总结 二、具体实践ClusterIPClusterIP 基本概念应用场景 NodePortNodePort 简介应用场景 ExternalName简介应用场景 一、Service 简介 Kubernetes (k8s) 中的 Service 对象是一…

使用redis设计延迟队列

目录 延迟队列概念与重要性 定义&#xff1a;延迟队列的基本概念 重要性&#xff1a;延迟队列在处理异步任务中的关键作用 图表&#xff1a;延迟队列的工作流程图 ​编辑延迟队列设计案例 背景介绍 设计目标 系统架构 设计要点 现有物理拓扑 图表&#xff1a;有赞延迟…

GStreamer 简明教程(五):Pad 相关概念介绍,Pad Capabilities/Templates

系列文章目录 GStreamer 简明教程&#xff08;一&#xff09;&#xff1a;环境搭建&#xff0c;运行 Basic Tutorial 1 Hello world! GStreamer 简明教程&#xff08;二&#xff09;&#xff1a;基本概念介绍&#xff0c;Element 和 Pipeline GStreamer 简明教程&#xff08;三…

自修C++Primer----3.2标准库类型string

目录 1.String的相关操作 1.1拷贝初始化&&直接初始化 1.2显示创建临时对象 1.3读取string对象内容 1.4一次读取多个未知对象 1.5使用getline读取一整行内容 1.6size()的返回值size_type类型 1.7两个string对象比较 1.8string对象赋值 1.9两个string对象相加 1…

策略产品 ①算法逻辑

目录 一、机器学习与AI的关系 二、机器学习全流程 1. 问题定义 2. 数据处理 3. 特征工程 4. 模型训练 5. 模型评估 6. 模型应用 机器学习是AI的关键技术之一&#xff0c;是指机器从历史数据中学习规律&#xff0c;从而提升系统某个性能度量的过程。这篇文章&#xff0c;我们在作…

C Primer Plus第十四章编程练习,仅供参考

第十四章编程练习 第一个问题让我们改写复习题5&#xff0c;创建一个函数去计算一年到某个月份的天数&#xff0c;在一个结构数组中去存储相关数据。完整程序代码以及运行结果如下&#xff1a; #include<stdio.h> #include<string.h> #include<ctype.h> st…

当外接硬盘接入到macOS上,只读不可写时,应当格式化

当windows磁盘格式例如 NTFS 的硬盘接入到macOS上时&#xff0c;会发现无法新建文件夹&#xff0c;无法删除、重命名。原因是磁盘格式对不上macOS&#xff0c;需要进行格式化。格式化时请注意备份重要数据。具体做法如下&#xff0c;在macOS中找到磁盘工具&#xff0c;然后对磁…

【HTML】常用几种模拟动画效果【附源代码】

1. 模拟音频波纹加载效果 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthde…

计算机视觉编程

目录 灰色度 缩略图 拷贝粘贴区域 调整图像尺寸 旋转图像45 画图线、描点 灰色度 灰度是指图像中每个像素的亮度值&#xff0c;用来描述图像中各个像素的明暗程度。在计算机视觉中&#xff0c;灰度可以通过以下方式来计算&#xff1a; 1. 平均值法&#xff1a;将图像中每…

如何在程序中创建出多条线程

多线程是编程中的一个重要概念&#xff0c;它允许程序同时执行多个任务&#xff0c;每个任务可以看作是一个线程。在Java中&#xff0c;多线程尤为常见且强大&#xff0c;它通过允许程序在并发环境下运行&#xff0c;提高了程序的执行效率和响应速度。以下是对Java多线程的详细…