8.2 KiB
8.2 KiB
银行系统数据库架构设计
概述
本文档描述了银行管理后台系统的数据库架构设计,包括表结构、字段定义、索引设计和关系约束。
数据库信息
- 数据库类型: 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 | 用户名 |
| 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: 已冲正
关系设计
外键约束
-
users.role_id → roles.id
- 用户与角色的多对一关系
- 级联更新,限制删除
-
accounts.user_id → users.id
- 账户与用户的多对一关系
- 级联更新,限制删除
-
transactions.account_id → accounts.id
- 交易记录与账户的多对一关系
- 级联更新,限制删除
业务约束
-
账户余额约束
- balance >= 0
- available_balance >= 0
- frozen_amount >= 0
- balance = available_balance + frozen_amount
-
交易金额约束
- amount > 0
- balance_after = balance_before ± amount
-
用户状态约束
- 锁定用户不能登录
- 暂停用户不能进行交易
数据完整性
触发器设计
-
账户余额更新触发器
- 确保余额字段的一致性
- 自动计算可用余额
-
交易记录触发器
- 自动更新账户余额
- 记录余额变化历史
存储过程
-
转账处理存储过程
- 原子性转账操作
- 自动生成交易记录
-
利息计算存储过程
- 定期计算账户利息
- 批量更新账户余额
性能优化
分区策略
- 交易记录表分区
- 按创建时间分区(按月)
- 提高查询性能
- 便于历史数据归档
索引优化
-
复合索引
- (account_id, created_at): 账户交易查询
- (transaction_type, status): 交易统计查询
- (user_id, status): 用户状态查询
-
覆盖索引
- 减少回表查询
- 提高查询效率
数据安全
敏感数据加密
-
密码加密
- 使用bcrypt算法
- 盐值随机生成
-
身份证号加密
- 存储时加密
- 查询时解密
数据备份
-
全量备份
- 每日凌晨自动备份
- 保留30天历史
-
增量备份
- 每小时增量备份
- 实时同步到备库
监控与维护
性能监控
-
慢查询监控
- 记录执行时间>1s的查询
- 定期优化慢查询
-
连接数监控
- 监控数据库连接数
- 防止连接池耗尽
数据清理
-
日志清理
- 定期清理过期日志
- 保留关键操作记录
-
历史数据归档
- 超过1年的交易记录归档
- 减少主表数据量
扩展性设计
水平扩展
-
读写分离
- 主库写入,从库读取
- 提高系统并发能力
-
分库分表
- 按用户ID分库
- 按时间分表
垂直扩展
-
字段扩展
- 预留扩展字段
- 支持业务需求变化
-
表结构扩展
- 模块化表设计
- 支持功能模块独立
最后更新: 2025-01-18 版本: v1.0