Files
nxxmdata/bank-backend/docs/database-schema.md
2025-09-17 18:04:28 +08:00

8.2 KiB
Raw Blame History

银行系统数据库架构设计

概述

本文档描述了银行管理后台系统的数据库架构设计,包括表结构、字段定义、索引设计和关系约束。

数据库信息

  • 数据库类型: MySQL 8.0+
  • 字符集: utf8mb4
  • 排序规则: utf8mb4_unicode_ci
  • 时区: +08:00 (Asia/Shanghai)

表结构设计

1. 用户表 (users)

存储银行系统的用户信息。

字段名 类型 约束 描述
id INT PRIMARY KEY, AUTO_INCREMENT 用户ID
username VARCHAR(50) UNIQUE, NOT NULL 用户名
email VARCHAR(100) UNIQUE, NOT NULL 邮箱地址
password VARCHAR(255) NOT NULL 密码bcrypt加密
phone VARCHAR(20) NULL 手机号
real_name VARCHAR(50) NOT NULL 真实姓名
id_card VARCHAR(18) UNIQUE, NOT NULL 身份证号
avatar VARCHAR(255) NULL 头像URL
role_id INT FOREIGN KEY, NOT NULL 角色ID
status ENUM DEFAULT 'active' 用户状态
last_login DATETIME NULL 最后登录时间
login_attempts INT DEFAULT 0 登录失败次数
locked_until DATETIME NULL 账户锁定到期时间
created_at DATETIME DEFAULT CURRENT_TIMESTAMP 创建时间
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE 更新时间

索引设计:

  • PRIMARY KEY (id)
  • UNIQUE KEY (username)
  • UNIQUE KEY (email)
  • UNIQUE KEY (id_card)
  • INDEX (role_id)
  • INDEX (status)
  • INDEX (created_at)

状态枚举:

  • active: 正常
  • inactive: 未激活
  • suspended: 暂停
  • locked: 锁定

2. 角色表 (roles)

存储系统角色信息。

字段名 类型 约束 描述
id INT PRIMARY KEY, AUTO_INCREMENT 角色ID
name VARCHAR(50) UNIQUE, NOT NULL 角色名称
display_name VARCHAR(100) NOT NULL 显示名称
description TEXT NULL 角色描述
level INT NOT NULL, DEFAULT 1 角色级别
is_system BOOLEAN DEFAULT FALSE 是否系统角色
status ENUM DEFAULT 'active' 角色状态
created_at DATETIME DEFAULT CURRENT_TIMESTAMP 创建时间
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE 更新时间

索引设计:

  • PRIMARY KEY (id)
  • UNIQUE KEY (name)
  • INDEX (level)
  • INDEX (status)

预定义角色:

  • admin: 系统管理员 (level: 100)
  • manager: 银行经理 (level: 80)
  • teller: 银行柜员 (level: 60)
  • user: 普通用户 (level: 20)

3. 账户表 (accounts)

存储银行账户信息。

字段名 类型 约束 描述
id INT PRIMARY KEY, AUTO_INCREMENT 账户ID
account_number VARCHAR(20) UNIQUE, NOT NULL 账户号码
user_id INT FOREIGN KEY, NOT NULL 用户ID
account_type ENUM NOT NULL, DEFAULT 'savings' 账户类型
balance BIGINT NOT NULL, DEFAULT 0 账户余额(分)
available_balance BIGINT NOT NULL, DEFAULT 0 可用余额(分)
frozen_amount BIGINT NOT NULL, DEFAULT 0 冻结金额(分)
currency VARCHAR(3) NOT NULL, DEFAULT 'CNY' 货币类型
interest_rate DECIMAL(5,4) NULL 利率(年化)
status ENUM NOT NULL, DEFAULT 'active' 账户状态
opened_at DATETIME NOT NULL, DEFAULT CURRENT_TIMESTAMP 开户时间
closed_at DATETIME NULL 销户时间
created_at DATETIME DEFAULT CURRENT_TIMESTAMP 创建时间
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE 更新时间

索引设计:

  • PRIMARY KEY (id)
  • UNIQUE KEY (account_number)
  • INDEX (user_id)
  • INDEX (account_type)
  • INDEX (status)
  • INDEX (opened_at)

账户类型枚举:

  • savings: 储蓄账户
  • checking: 支票账户
  • credit: 信用卡账户
  • loan: 贷款账户

账户状态枚举:

  • active: 正常
  • inactive: 未激活
  • frozen: 冻结
  • closed: 已关闭

4. 交易记录表 (transactions)

存储所有银行交易记录。

字段名 类型 约束 描述
id INT PRIMARY KEY, AUTO_INCREMENT 交易ID
transaction_number VARCHAR(32) UNIQUE, NOT NULL 交易流水号
account_id INT FOREIGN KEY, NOT NULL 账户ID
transaction_type ENUM NOT NULL 交易类型
amount BIGINT NOT NULL 交易金额(分)
balance_before BIGINT NOT NULL 交易前余额(分)
balance_after BIGINT NOT NULL 交易后余额(分)
counterparty_account VARCHAR(20) NULL 对方账户号
counterparty_name VARCHAR(100) NULL 对方户名
description VARCHAR(255) NULL 交易描述
reference_number VARCHAR(50) NULL 参考号
status ENUM NOT NULL, DEFAULT 'pending' 交易状态
processed_at DATETIME NULL 处理时间
reversed_at DATETIME NULL 撤销时间
created_at DATETIME DEFAULT CURRENT_TIMESTAMP 创建时间
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE 更新时间

索引设计:

  • PRIMARY KEY (id)
  • UNIQUE KEY (transaction_number)
  • INDEX (account_id)
  • INDEX (transaction_type)
  • INDEX (status)
  • INDEX (created_at)
  • INDEX (counterparty_account)

交易类型枚举:

  • deposit: 存款
  • withdrawal: 取款
  • transfer_in: 转入
  • transfer_out: 转出
  • interest: 利息
  • fee: 手续费
  • loan: 贷款
  • repayment: 还款

交易状态枚举:

  • pending: 处理中
  • completed: 已完成
  • failed: 失败
  • cancelled: 已取消
  • reversed: 已冲正

关系设计

外键约束

  1. users.role_idroles.id

    • 用户与角色的多对一关系
    • 级联更新,限制删除
  2. accounts.user_idusers.id

    • 账户与用户的多对一关系
    • 级联更新,限制删除
  3. transactions.account_idaccounts.id

    • 交易记录与账户的多对一关系
    • 级联更新,限制删除

业务约束

  1. 账户余额约束

    • balance >= 0
    • available_balance >= 0
    • frozen_amount >= 0
    • balance = available_balance + frozen_amount
  2. 交易金额约束

    • amount > 0
    • balance_after = balance_before ± amount
  3. 用户状态约束

    • 锁定用户不能登录
    • 暂停用户不能进行交易

数据完整性

触发器设计

  1. 账户余额更新触发器

    • 确保余额字段的一致性
    • 自动计算可用余额
  2. 交易记录触发器

    • 自动更新账户余额
    • 记录余额变化历史

存储过程

  1. 转账处理存储过程

    • 原子性转账操作
    • 自动生成交易记录
  2. 利息计算存储过程

    • 定期计算账户利息
    • 批量更新账户余额

性能优化

分区策略

  1. 交易记录表分区
    • 按创建时间分区(按月)
    • 提高查询性能
    • 便于历史数据归档

索引优化

  1. 复合索引

    • (account_id, created_at): 账户交易查询
    • (transaction_type, status): 交易统计查询
    • (user_id, status): 用户状态查询
  2. 覆盖索引

    • 减少回表查询
    • 提高查询效率

数据安全

敏感数据加密

  1. 密码加密

    • 使用bcrypt算法
    • 盐值随机生成
  2. 身份证号加密

    • 存储时加密
    • 查询时解密

数据备份

  1. 全量备份

    • 每日凌晨自动备份
    • 保留30天历史
  2. 增量备份

    • 每小时增量备份
    • 实时同步到备库

监控与维护

性能监控

  1. 慢查询监控

    • 记录执行时间>1s的查询
    • 定期优化慢查询
  2. 连接数监控

    • 监控数据库连接数
    • 防止连接池耗尽

数据清理

  1. 日志清理

    • 定期清理过期日志
    • 保留关键操作记录
  2. 历史数据归档

    • 超过1年的交易记录归档
    • 减少主表数据量

扩展性设计

水平扩展

  1. 读写分离

    • 主库写入,从库读取
    • 提高系统并发能力
  2. 分库分表

    • 按用户ID分库
    • 按时间分表

垂直扩展

  1. 字段扩展

    • 预留扩展字段
    • 支持业务需求变化
  2. 表结构扩展

    • 模块化表设计
    • 支持功能模块独立

最后更新: 2025-01-18 版本: v1.0