MySQL表对账设计_对账系统设计
>更多支付内容请移步个人站:YKBLog.top
从整体来看,按照时序维度的先后,系统对账主要分为三阶段的工作。分别是数据准备、数据核对和差错处理。数据准备细分一下,又分为文件获取、文件解析、数据清洗。
在对账专业概念中,数据核对和差错处理又叫轧账和平账。
具体设计脑图如下:
对账各个模块设计
数据准备
数据准备,顾名思义,我们需要把对账所需的全部数据,接入到我们的对账系统。该模块主要实现两个目标:为不同的外部系统提供多元化的接入机制。
通过数据适配的手段把外部数据以统一的格式进行转换和存储。
在数据接入层,我们会针对不同的数据接入方提供三种不同的数据接入模式。如下图:
数据拉取
主动拉取数据,并通过数据适配的方式,将数据存储到对账数据池中。
数据推送
指定标准规范和格式,供各个接入方使用,统一格式推送到对账服务。
人工上传
提供标准的文件模板,由业务接入方填充数据,通过后台文件上传或SFTP上传工具的方式将数据上传到对账服务。
人工上传文件处理方式步骤如下:下载文件
从指定SFTP服务器下载文件。
解压文件
一般为zip压缩包,节省存储空间,提高上传和下载速度。
解析文件
一般文件格式为EXCEL(财务人工上传文件,一般从银行或第三方支付后台下载)、CSV(数据接入方一般从数据库导出格式,或第三方支付提供的文件格式)、TXT。
存储数据
将第三步得到的数据存储、持久化到数据库,一般底稿数据都存储最全数方便问题追溯。
数据清洗顾名思义,即对准备的上下游数据进行清洗。
清洗的作用或原因:
从底稿提取对账核心字段
一般参与对账的字段就几个,具体字段:银行卡号、银行单号、业务单号、支付金额、支付方式、支付完成时间、核对状态。
上文提到底稿一般建议存储所有数据,数据太多影响对账性能和效率。
合并、排除无用数据
上文提到底稿一般建议存储所有数据,难免有无用数据需要剔除,或者排除业务或财务指定无需对账的数据;合并特殊业务或流程产生的N对1数据。
数据核对
对账的核心
数据核对是对账的核心,对账的主逻辑;一般对账方式有两种,即对明细账和对总账,对总账一般包括总金额和总条目。一般做法为对明细账,即上下游每条记录逐一比对。
核对的结果
核对一般就是两个结果:对上帐和对不上账,对不上账有分三种结果,上游单边(支付中一般称为企业单边,即长款),下游单边(支付中一般称为银行边,即漏单),金额不等(即两边都有数据,金额对不上)。
设计normal和different两张表,分别存储不同的核对结果数据,方便后期统计以及为业务提供能力。
具体对账的方法有多种,比如:sql核对
exist insert select
最简单的方式,也是问题比较多方式,对数据库压力比较大,数据特别多的时候,对账效率比较低。
redis核对
set集合分别diff (inter)上游、下游数据
比较好的方式,可以降低数据库压力,redis方便根据数据量做水平扩展。
sprak核对
采用流式运算进行比对;(具体做法待扩展)
差错处理
在一般系统中,差错处理分为两种,一种人工来处理,一种系统自动来处理。
人工处理一般两个操作:平账和勾兑,勾兑一般处理的是单边情况,比如由于系统bug出现的单边问题,经由人工溯源修复bug之后,相关业务人员即可在对账后台将该条数据进行勾兑。
系统自动处理一般为:自动补单和驱动下游流程完成两种方式。主要有如下情况:
下游单边(银行单边)情况
业务未支付,支付渠道已支付。这主要是本地未正确接收到渠道下发的异步通知导致。
一般处理是将本地状态修改为已支付,并做响应的后续处理,比如通知业务方等。
上游单边(企业单边)情况
业务已支付,但是支付渠道中无记录;或者本地无记录,支付渠道有记录。
在排除跨日因素外,这种情况非常少见,需要了解具体原因后做处理。
金额不等情况
业务已支付,支付渠道已支付,但是金额不同,这个需要人工核查。
对账统计
根据对账处理结果,统计的数据由:汇总总条目、汇总总金额、汇总差异结果、汇总单边结果、汇总处理结果。
业务和财务关系的统计的相关信息有:对账完成时间、对账是否成功、平账的金额和订单数、差错的金额和订单数、缓存池金额和订单数等。
对账系统相关设计
分布式定时系统
一般对账系统都是N+1离线对账,所有上述所有模块的设计一般使用定时任务去执行。不可能所有模块、所有银行卡都用一个任务去执行,也不可能只用一台机器去执行,这样一天可能都跑不完所有的数据。
所以考虑到优化,一般设置为集群分布式的去跑任务,所以涉及一个分布式定时系统对对账系统来说很重要,考虑成本和时间问题,可以简单实现分布式任务效果。分布式定时系统的设计后续再单独探讨。
即使所有任务都按模块化去进行划分,按模块化单独起任务去执行业务逻辑,也会存在时间效率的瓶颈(因为下文提到的依赖关系,导致并不能让所有的任务都并行起来)。再加上银行卡号比较多的情况下,最好情况就是各个银行卡号并行处理,即并发粒度设计到银行卡号维度,使用多线程把所有银行卡的对账任务并行起来。
依赖链设计
所有模块是存在依赖关系的,比如清洗之前,肯定要数据准备完成;但是上游数据和下游数据的准备、清洗可以并发的执行。整体依赖链如下:
核心对账优化
上文模块设计有提到核心对账的多种实现思路,这里推荐的两种:redis 实现
sprak 实现
具体实现过程会在后续博文中详细介绍。
对账系统数据库模型
按以上设计模型,具体数据模型如下介绍。
底稿数据表各个上游数据、下游数据抓取、解析的底稿数据 。
不只两张表,由具体业务决定;数据量比较大,一般按日期水平分表,按实际业务考虑要不要垂直分表。
清洗表从各个上游数据、下游数据的底稿数据取部分字段。
不只两张表,由具体业务决定;数据量比较大,一般按日期分表。
对账结果表正常表
用来存放对上账的数据(即对账结果正常的数据,一般数据量比较大,需要按日期分表)
异常表
用来存放对不上账的数据(上游单边、下游单边、金额不等)。
对账汇总表
即对对账数据的汇总
技术相关表
定时配置、账户配置、异常信息等等相关表
>更多支付内容请移步个人站:YKBLog.top
MySQL表对账设计_对账系统设计相关推荐
- mysql在线考试的设计_在线考试系统设计与实现(MySQL)
在线考试系统设计与实现(MySQL)(任务书,开题报告,中期检查表,文献综述,外文翻译,毕业论文20000字,程序代码,MySQL数据库) 教育的进步改革,不仅仅体现在教育理念的进步改革,也体现在教育 ...
- MySQL表对账设计_从零开始设计对账系统
前言 对账系统作为支付系统中的基石系统,处于整个支付环节中的最后一层,主要用来保证我方支付数据与第三方支付渠道或银行的数据一致性. 在没有对账系统之前,财务在第二日手工核对前一日的应收与实收.倘若不一 ...
- java运费模板设计_电商系统设计之运费模板(下)
电商大伙每天都在用,类似某猫,某狗等. 电商系统设计看似复杂又很简单,看似简单又很复杂 本章适合初中级工程师细看,大佬请随意 前言 在订单系统中,运费模板是其中一个重要组成部分,看似简单的一个设置,在 ...
- 修改mysql 表数据翻倍_【原创】关于MySQL表设计应该注意的问题(做了点修改)
关于设计表时应该注意的问题 如有错误欢迎大家指出.这段时间在家里,做了点修正. 1.慎重选择表名. 有两种选择: 按照多数开发语言的命名规则.比如(myCustomer). 按照多数开源思想命名规则. ...
- mysql评论表结构设计_文章评论嵌套显示mysql表结构如何设计(形式如网易新闻评论)...
现在有一张post表 (结构不能改变) tid 主题pid pid 回复id 现在新增了评论嵌套显示功能,即tid=1 a评论了一条 pid为1 b回复了a的评论 pid为2 c回复了b的评论 pid ...
- mysql一对多如何设计_数据库在一对一、一对多、多对多怎么设计表关系
1.一对一可以两个实体设计在一个数据库中l例如设计一个夫妻表,里面放丈夫和妻子 2.一对多可以建两张表,将一这一方的主键作为多那一方的外键,例如一个学生表可以加一个字段指向班级(班级与学生一对多的关系 ...
- mysql主从表单如何设计_如何快速的10分钟制作一张主从表单及功能
//#region 奖励管理--主单列表//奖励管理--主单列表--页面加载 function Reward_MainList_Init() { func_InitPageDataSource(); ...
- mysql订单详情的设计_订单功能模块设计与实现
在商城项目中,之前我们介绍了购物车功能模块的实现,商品加入到购物车之后,就是到购物车结算,然后显示购物车的商品列表,点击去结算,然后到了未提交前的订单列表, 点击提交订单后,生成此订单,返回订单的订单 ...
- mysql表名怎么拼接_自学MySQL第九天
接下来就要开始学习如何创建一个结构良好的数据库. 首先是DATA MODELLING,有四个过程. 1. Understand the requirements 要理解好工作需求才能做出好的数据库. ...
最新文章
- ORACLE 物化视图
- 王者荣耀回应服务器崩了:已处理完成 将陆续补发相应赔偿
- 2018/2/11 ELK技术栈之ElasticSearch学习笔记二
- 笔记+R︱风控模型中变量粗筛(随机森林party包)+细筛(woe包)
- python join 和 split的常用使用方法
- 1001	Hello,World!
- c盘瘦身 或者 c盘清理
- 房产中介管理系统php,房屋中介管理系统简易源代码.doc
- KOC十问:品牌缺钱的谎言,还是新瓶装旧酒?
- 罗大佑的童年用计算机咋弹,罗大佑《童年》吉他弹奏教学-520吉他网
- Java实现字典树 Trie
- 【手机】手机选购指南
- Python编写程序,实现对输入字符串的大小写字母翻转(即大写变小写、小写变大写)操作
- 标志设计中选择合适的字体
- vue打包后华为手机自带浏览器访问空白
- UnityShader_天空盒子中的反射、折射、聂菲尔效应
- 股票自选股基本函数大全-7
- 悼念图灵奖得主、ML语言之父Robin Milner
- 深入理解vue中的slot与slot-scope (简单易懂)
- 易语言报错:无法定位链接器!请检查 tools\link.ini 中的配置是否正确。 静态连接失败...
热门文章
- ElementUI Tab 右边加按钮
- python x pop,Python Set pop() 方法
- mysql序列表,自增序列生成合同编号
- VirtualBox Kaili Linux 环境搭建
- Excel数据分析基础(3)-----使用Excel 2019的新函数IFS计算平均值
- 华为猫复活记(ADSL猫固件升级失败修复)
- nvidia显卡 linux,Ubuntu下安装最新的Nvidia显卡驱动
- Java使用POI操作Excel文件
- ANSYS-螺钉弯曲分析
- python官网在哪里下载64bit_WinPython下载64bit