支付系统数据库表设计

支付系统数据库表设计

博主介绍:✌全网粉丝5W+,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验✌

博主作品:《Java项目案例》主要基于SpringBoot+MyBatis/MyBatis-plus+MySQL+Vue等前后端分离项目,可以在左边的分类专栏找到更多项目。《Uniapp项目案例》有几个有uniapp教程,企业实战开发。《微服务实战》专栏是本人的实战经验总结,《Spring家族及微服务系列》专注Spring、SpringMVC、SpringBoot、SpringCloud系列、Nacos等源码解读、热门面试题、架构设计等。除此之外还有不少文章等你来细细品味,更多惊喜等着你哦

🍅uniapp微信小程序🍅面试题软考题免费使用,还可以使用微信支付,扫码加群。由于维护成本问题得不到解决,可能将停止线上维护。

🍅文末获取联系🍅精彩专栏推荐订阅👇🏻👇🏻 不然下次找不到哟

Java项目案例《100套》 https://blog.csdn.net/qq_57756904/category_12173599.html uniapp小程序《100套》

https://blog.csdn.net/qq_57756904/category_12173599.html

有需求代码永远写不完,而方法才是破解之道,抖音有实战视频课程,某马某千等培训都是2万左右,甚至广东有本科院校单单一年就得3万4年就12万学费,而且还没有包括吃饭的钱。所以很划算了。另外博客左侧有源码阅读专栏,对于求职有很大帮助,当然对于工作也是有指导意义等。在大城市求职,你面试来回一趟多多少少都在12块左右,而且一般不会一次性就通过,还得面试几家。而如果你对源码以及微服务等有深度认识,这无疑给你的面试添砖加瓦更上一层楼。

最后再送一句:最好是学会了,而不是学废了!!

2

核心表结构设计

1. 用户账户相关表

用户信息表(user_info)

CREATE TABLE `user_info` (

`user_id` bigint(20) NOT NULL COMMENT '用户ID',

`user_name` varchar(64) NOT NULL COMMENT '用户名',

`user_type` tinyint(4) NOT NULL COMMENT '用户类型(1-个人 2-企业)',

`real_name` varchar(64) DEFAULT NULL COMMENT '真实姓名',

`id_card_no` varchar(32) DEFAULT NULL COMMENT '证件号码',

`mobile` varchar(20) DEFAULT NULL COMMENT '手机号',

`email` varchar(128) DEFAULT NULL COMMENT '邮箱',

`status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '状态(0-禁用 1-正常)',

`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',

`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',

PRIMARY KEY (`user_id`),

UNIQUE KEY `idx_mobile` (`mobile`),

KEY `idx_create_time` (`create_time`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户基本信息表';

账户表(account)

CREATE TABLE `account` (

`account_id` bigint(20) NOT NULL COMMENT '账户ID',

`user_id` bigint(20) NOT NULL COMMENT '用户ID',

`account_type` tinyint(4) NOT NULL COMMENT '账户类型(1-现金账户 2-信用账户)',

`currency` varchar(10) NOT NULL DEFAULT 'CNY' COMMENT '币种',

`balance` decimal(20,4) NOT NULL DEFAULT '0.0000' COMMENT '可用余额',

`freeze_amount` decimal(20,4) NOT NULL DEFAULT '0.0000' COMMENT '冻结金额',

`status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '状态(0-冻结 1-正常)',

`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',

`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',

PRIMARY KEY (`account_id`),

UNIQUE KEY `idx_user_currency_type` (`user_id`,`currency`,`account_type`),

KEY `idx_user_id` (`user_id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户账户表';

2. 支付交易相关表

支付订单表(payment_order)

CREATE TABLE `payment_order` (

`order_id` varchar(32) NOT NULL COMMENT '订单号',

`user_id` bigint(20) NOT NULL COMMENT '用户ID',

`merchant_id` bigint(20) NOT NULL COMMENT '商户ID',

`order_amount` decimal(20,4) NOT NULL COMMENT '订单金额',

`order_currency` varchar(10) NOT NULL DEFAULT 'CNY' COMMENT '订单币种',

`order_subject` varchar(256) NOT NULL COMMENT '订单标题',

`order_body` varchar(512) DEFAULT NULL COMMENT '订单描述',

`order_time` datetime NOT NULL COMMENT '订单创建时间',

`order_expire` datetime DEFAULT NULL COMMENT '订单过期时间',

`order_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '订单状态(0-待支付 1-支付中 2-支付成功 3-支付失败 4-已关闭)',

`notify_url` varchar(512) DEFAULT NULL COMMENT '异步通知地址',

`callback_url` varchar(512) DEFAULT NULL COMMENT '前端跳转地址',

`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',

`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',

PRIMARY KEY (`order_id`),

KEY `idx_user_id` (`user_id`),

KEY `idx_merchant_id` (`merchant_id`),

KEY `idx_create_time` (`create_time`),

KEY `idx_order_status` (`order_status`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='支付订单表';

支付交易表(payment_transaction)

CREATE TABLE `payment_transaction` (

`transaction_id` varchar(32) NOT NULL COMMENT '交易流水号',

`order_id` varchar(32) NOT NULL COMMENT '关联订单号',

`user_id` bigint(20) NOT NULL COMMENT '用户ID',

`merchant_id` bigint(20) NOT NULL COMMENT '商户ID',

`transaction_amount` decimal(20,4) NOT NULL COMMENT '交易金额',

`transaction_currency` varchar(10) NOT NULL DEFAULT 'CNY' COMMENT '交易币种',

`transaction_type` tinyint(4) NOT NULL COMMENT '交易类型(1-支付 2-退款)',

`payment_method` tinyint(4) NOT NULL COMMENT '支付方式(1-余额 2-银行卡 3-支付宝 4-微信)',

`payment_channel` varchar(32) NOT NULL COMMENT '支付渠道编码',

`channel_transaction_id` varchar(64) DEFAULT NULL COMMENT '渠道交易号',

`transaction_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '交易状态(0-处理中 1-成功 2-失败)',

`complete_time` datetime DEFAULT NULL COMMENT '交易完成时间',

`error_code` varchar(32) DEFAULT NULL COMMENT '错误码',

`error_msg` varchar(128) DEFAULT NULL COMMENT '错误信息',

`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',

`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',

PRIMARY KEY (`transaction_id`),

UNIQUE KEY `idx_order_id_type` (`order_id`,`transaction_type`),

KEY `idx_user_id` (`user_id`),

KEY `idx_merchant_id` (`merchant_id`),

KEY `idx_channel_transaction_id` (`channel_transaction_id`),

KEY `idx_create_time` (`create_time`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='支付交易表';

3. 资金流水相关表

账户流水表(account_flow)

CREATE TABLE `account_flow` (

`flow_id` bigint(20) NOT NULL COMMENT '流水ID',

`account_id` bigint(20) NOT NULL COMMENT '账户ID',

`user_id` bigint(20) NOT NULL COMMENT '用户ID',

`transaction_id` varchar(32) NOT NULL COMMENT '关联交易号',

`order_id` varchar(32) NOT NULL COMMENT '关联订单号',

`flow_type` tinyint(4) NOT NULL COMMENT '流水类型(1-收入 2-支出 3-冻结 4-解冻)',

`flow_amount` decimal(20,4) NOT NULL COMMENT '变动金额',

`balance` decimal(20,4) NOT NULL COMMENT '变动后余额',

`flow_desc` varchar(256) DEFAULT NULL COMMENT '流水描述',

`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',

PRIMARY KEY (`flow_id`),

KEY `idx_account_id` (`account_id`),

KEY `idx_user_id` (`user_id`),

KEY `idx_transaction_id` (`transaction_id`),

KEY `idx_order_id` (`order_id`),

KEY `idx_create_time` (`create_time`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='账户流水表';

4. 渠道相关表

支付渠道表(payment_channel)

CREATE TABLE `payment_channel` (

`channel_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '渠道ID',

`channel_code` varchar(32) NOT NULL COMMENT '渠道编码',

`channel_name` varchar(64) NOT NULL COMMENT '渠道名称',

`channel_type` tinyint(4) NOT NULL COMMENT '渠道类型(1-银行卡 2-第三方支付)',

`merchant_id` varchar(64) DEFAULT NULL COMMENT '渠道商户号',

`merchant_key` varchar(256) DEFAULT NULL COMMENT '渠道密钥',

`api_url` varchar(512) DEFAULT NULL COMMENT '接口地址',

`status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '状态(0-禁用 1-启用)',

`config_json` text COMMENT '渠道配置JSON',

`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',

`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',

PRIMARY KEY (`channel_id`),

UNIQUE KEY `idx_channel_code` (`channel_code`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='支付渠道表';

5. 对账相关表

对账批次表(recon_batch)

CREATE TABLE `recon_batch` (

`batch_id` bigint(20) NOT NULL COMMENT '对账批次ID',

`channel_code` varchar(32) NOT NULL COMMENT '渠道编码',

`batch_date` date NOT NULL COMMENT '对账日期',

`batch_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '状态(0-初始化 1-对账中 2-对账完成 3-异常)',

`total_count` int(11) DEFAULT '0' COMMENT '总记录数',

`success_count` int(11) DEFAULT '0' COMMENT '成功记录数',

`fail_count` int(11) DEFAULT '0' COMMENT '失败记录数',

`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',

`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',

PRIMARY KEY (`batch_id`),

UNIQUE KEY `idx_channel_date` (`channel_code`,`batch_date`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='对账批次表';

对账差异表(recon_diff)

CREATE TABLE `recon_diff` (

`diff_id` bigint(20) NOT NULL COMMENT '差异ID',

`batch_id` bigint(20) NOT NULL COMMENT '对账批次ID',

`transaction_id` varchar(32) NOT NULL COMMENT '交易流水号',

`channel_transaction_id` varchar(64) DEFAULT NULL COMMENT '渠道交易号',

`diff_type` tinyint(4) NOT NULL COMMENT '差异类型(1-我方有渠道无 2-渠道有我方无 3-金额不一致)',

`our_amount` decimal(20,4) DEFAULT NULL COMMENT '我方金额',

`channel_amount` decimal(20,4) DEFAULT NULL COMMENT '渠道金额',

`our_status` tinyint(4) DEFAULT NULL COMMENT '我方状态',

`channel_status` tinyint(4) DEFAULT NULL COMMENT '渠道状态',

`handle_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '处理状态(0-未处理 1-已处理)',

`handle_remark` varchar(256) DEFAULT NULL COMMENT '处理备注',

`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',

`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',

PRIMARY KEY (`diff_id`),

KEY `idx_batch_id` (`batch_id`),

KEY `idx_transaction_id` (`transaction_id`),

KEY `idx_channel_transaction_id` (`channel_transaction_id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='对账差异表';

分库分表策略

用户相关表:按user_id哈希分片

user_info

account

account_flow

交易相关表:按创建时间范围分表

payment_order_YYYYMM

payment_transaction_YYYYMM

对账相关表:按对账日期分表

recon_batch_YYYY

recon_diff_YYYY

索引设计原则

所有主表必须有自增主键

高频查询字段建立索引

联合查询字段建立组合索引

状态字段建立索引用于筛选

时间字段建立索引用于范围查询

数据安全考虑

敏感字段加密存储(如身份证、银行卡号)

操作日志表记录关键数据变更

定期数据备份策略

敏感数据访问权限控制

这个数据库设计涵盖了支付系统核心功能,可根据实际业务需求进行调整和扩展。

3

相关故事

明示的解釋
任丘36524便利店电话

明示的解釋

《星海爭霸 II》更新檔 5.0.14 說明
任丘36524便利店电话

《星海爭霸 II》更新檔 5.0.14 說明

如何编辑已加密的PDF文件?分享几款实用的PDF编辑工具
mobile365体育手机版入口

如何编辑已加密的PDF文件?分享几款实用的PDF编辑工具