314 lines
8.2 KiB
Markdown
314 lines
8.2 KiB
Markdown
|
|
# 银行系统数据库架构设计
|
|||
|
|
|
|||
|
|
## 概述
|
|||
|
|
|
|||
|
|
本文档描述了银行管理后台系统的数据库架构设计,包括表结构、字段定义、索引设计和关系约束。
|
|||
|
|
|
|||
|
|
## 数据库信息
|
|||
|
|
|
|||
|
|
- **数据库类型**: 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_id** → **roles.id**
|
|||
|
|
- 用户与角色的多对一关系
|
|||
|
|
- 级联更新,限制删除
|
|||
|
|
|
|||
|
|
2. **accounts.user_id** → **users.id**
|
|||
|
|
- 账户与用户的多对一关系
|
|||
|
|
- 级联更新,限制删除
|
|||
|
|
|
|||
|
|
3. **transactions.account_id** → **accounts.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*
|