# 银行系统数据库架构设计

## 概述

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

## 数据库信息

- **数据库类型**: 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*