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