更新政府端和银行端
This commit is contained in:
314
bank-backend/docs/database-schema.md
Normal file
314
bank-backend/docs/database-schema.md
Normal file
@@ -0,0 +1,314 @@
|
||||
# 银行系统数据库架构设计
|
||||
|
||||
## 概述
|
||||
|
||||
本文档描述了银行管理后台系统的数据库架构设计,包括表结构、字段定义、索引设计和关系约束。
|
||||
|
||||
## 数据库信息
|
||||
|
||||
- **数据库类型**: 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*
|
||||
Reference in New Issue
Block a user