Files
nxxmdata/bank-backend/docs/database-schema.md

314 lines
8.2 KiB
Markdown
Raw Normal View History

2025-09-17 18:04:28 +08:00
# 银行系统数据库架构设计
## 概述
本文档描述了银行管理后台系统的数据库架构设计,包括表结构、字段定义、索引设计和关系约束。
## 数据库信息
- **数据库类型**: 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*