博主介绍:✌全网粉丝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='对账差异表';

分库分表策略

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

    • user_info

    • account

    • account_flow

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

    • payment_order_YYYYMM

    • payment_transaction_YYYYMM

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

    • recon_batch_YYYY

    • recon_diff_YYYY

索引设计原则

  1. 所有主表必须有自增主键

  2. 高频查询字段建立索引

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

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

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

数据安全考虑

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

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

  3. 定期数据备份策略

  4. 敏感数据访问权限控制

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

3

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐