fujian_water_biz_doc/water_biz_database_design.md

272 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 福建水务营收系统数据库设计
## 一、数据库设计概述
福建水务营收系统采用关系型数据库MySQL作为主要存储系统结合Redis缓存提升性能。数据库设计遵循标准化原则确保数据完整性、一致性和高效性。
## 二、数据库架构设计
### 1. 数据库架构图
```mermaid
graph TD
App[应用服务] --> Master[(主数据库)]
Master --> Slave1[(从数据库1)]
Master --> Slave2[(从数据库2)]
App --> Redis[(Redis缓存)]
subgraph 主从复制架构
Master
Slave1
Slave2
end
subgraph 缓存层
Redis
end
```
### 2. 主要特点
- **读写分离**: 主库负责写操作,从库负责读操作,提高系统吞吐量
- **数据冗余**: 通过主从复制实现数据冗余,提高可用性
- **缓存加速**: 使用Redis缓存热点数据减轻数据库压力
- **分库设计**: 按业务功能划分为多个逻辑库,便于管理和维护
- **分表策略**: 对大表采用分表策略,提高查询效率
## 三、数据模型设计
### 1. 实体关系图(ER图)
```mermaid
erDiagram
SYS_USER ||--o{ SYS_USER_ROLE : has
SYS_ROLE ||--o{ SYS_USER_ROLE : assigned_to
SYS_ROLE ||--o{ SYS_ROLE_MENU : has
SYS_MENU ||--o{ SYS_ROLE_MENU : assigned_to
WATER_CUSTOMER ||--o{ WATER_METER : owns
WATER_METER ||--o{ WATER_METER_READING : has
WATER_METER_READING ||--o{ WATER_BILLING : generates
WATER_CUSTOMER ||--o{ WATER_BILLING : billed
WATER_BILLING ||--o{ WATER_PAYMENT : paid_by
WATER_PAYMENT ||--o{ WATER_INVOICE : has
WATER_PRICE ||--o{ WATER_BILLING : applied_to
WATER_EMPLOYEE ||--o{ WATER_METER_READING : records
WATER_SERVICE_POINT ||--o{ WATER_EMPLOYEE : works_at
```
### 2. 数据库表结构设计
#### 2.1 系统管理模块
##### SYS_USER (用户表)
| 字段名 | 数据类型 | 长度 | 是否必填 | 主键 | 说明 |
|-------|---------|------|---------|-----|------|
| id | bigint | 20 | 是 | 是 | 用户ID |
| username | varchar | 50 | 是 | 否 | 用户名 |
| password | varchar | 100 | 是 | 否 | 密码 |
| nickname | varchar | 50 | 否 | 否 | 昵称 |
| dept_id | bigint | 20 | 否 | 否 | 部门ID |
| phone | varchar | 11 | 否 | 否 | 手机号 |
| email | varchar | 50 | 否 | 否 | 邮箱 |
| gender | tinyint | 4 | 否 | 否 | 性别 |
| avatar | varchar | 100 | 否 | 否 | 头像 |
| status | tinyint | 4 | 是 | 否 | 状态(0正常,1停用) |
| login_ip | varchar | 50 | 否 | 否 | 最后登录IP |
| login_date | datetime | - | 否 | 否 | 最后登录时间 |
| creator | varchar | 64 | 否 | 否 | 创建者 |
| create_time | datetime | - | 是 | 否 | 创建时间 |
| updater | varchar | 64 | 否 | 否 | 更新者 |
| update_time | datetime | - | 是 | 否 | 更新时间 |
| deleted | bit | 1 | 是 | 否 | 是否删除 |
##### SYS_ROLE (角色表)
| 字段名 | 数据类型 | 长度 | 是否必填 | 主键 | 说明 |
|-------|---------|------|---------|-----|------|
| id | bigint | 20 | 是 | 是 | 角色ID |
| name | varchar | 30 | 是 | 否 | 角色名称 |
| code | varchar | 100 | 是 | 否 | 角色编码 |
| sort | int | 11 | 是 | 否 | 显示顺序 |
| status | tinyint | 4 | 是 | 否 | 状态(0正常,1停用) |
| type | tinyint | 4 | 是 | 否 | 角色类型 |
| remark | varchar | 500 | 否 | 否 | 备注 |
| creator | varchar | 64 | 否 | 否 | 创建者 |
| create_time | datetime | - | 是 | 否 | 创建时间 |
| updater | varchar | 64 | 否 | 否 | 更新者 |
| update_time | datetime | - | 是 | 否 | 更新时间 |
| deleted | bit | 1 | 是 | 否 | 是否删除 |
#### 2.2 客户水表模块
##### WATER_CUSTOMER (客户表)
| 字段名 | 数据类型 | 长度 | 是否必填 | 主键 | 说明 |
|-------|---------|------|---------|-----|------|
| id | bigint | 20 | 是 | 是 | 客户ID |
| customer_no | varchar | 50 | 是 | 否 | 客户编号 |
| name | varchar | 100 | 是 | 否 | 客户名称 |
| type | tinyint | 4 | 是 | 否 | 客户类型(1居民,2企业,3政府,4其它) |
| contact | varchar | 50 | 否 | 否 | 联系人 |
| phone | varchar | 20 | 否 | 否 | 联系电话 |
| address | varchar | 200 | 否 | 否 | 地址 |
| id_card | varchar | 20 | 否 | 否 | 身份证号 |
| bank_account | varchar | 50 | 否 | 否 | 银行账号 |
| bank_name | varchar | 100 | 否 | 否 | 开户行 |
| status | tinyint | 4 | 是 | 否 | 状态(0正常,1冻结) |
| creator | varchar | 64 | 否 | 否 | 创建者 |
| create_time | datetime | - | 是 | 否 | 创建时间 |
| updater | varchar | 64 | 否 | 否 | 更新者 |
| update_time | datetime | - | 是 | 否 | 更新时间 |
| deleted | bit | 1 | 是 | 否 | 是否删除 |
##### WATER_METER (水表表)
| 字段名 | 数据类型 | 长度 | 是否必填 | 主键 | 说明 |
|-------|---------|------|---------|-----|------|
| id | bigint | 20 | 是 | 是 | 水表ID |
| meter_no | varchar | 50 | 是 | 否 | 水表编号 |
| customer_id | bigint | 20 | 是 | 否 | 客户ID |
| meter_type | tinyint | 4 | 是 | 否 | 水表类型(1普通,2IC卡,3智能) |
| caliber | varchar | 20 | 否 | 否 | 口径规格 |
| install_date | date | - | 否 | 否 | 安装日期 |
| initial_reading | decimal | 10,2 | 是 | 否 | 起始读数 |
| current_reading | decimal | 10,2 | 是 | 否 | 当前读数 |
| install_address | varchar | 200 | 否 | 否 | 安装地址 |
| status | tinyint | 4 | 是 | 否 | 状态(0正常,1故障,2停用) |
| reading_cycle | tinyint | 4 | 是 | 否 | 抄表周期(1月,2季,3年) |
| description | varchar | 500 | 否 | 否 | 备注说明 |
| creator | varchar | 64 | 否 | 否 | 创建者 |
| create_time | datetime | - | 是 | 否 | 创建时间 |
| updater | varchar | 64 | 否 | 否 | 更新者 |
| update_time | datetime | - | 是 | 否 | 更新时间 |
| deleted | bit | 1 | 是 | 否 | 是否删除 |
#### 2.3 抄表收费模块
##### WATER_METER_READING (抄表记录表)
| 字段名 | 数据类型 | 长度 | 是否必填 | 主键 | 说明 |
|-------|---------|------|---------|-----|------|
| id | bigint | 20 | 是 | 是 | 抄表记录ID |
| meter_id | bigint | 20 | 是 | 否 | 水表ID |
| reading_date | date | - | 是 | 否 | 抄表日期 |
| reading | decimal | 10,2 | 是 | 否 | 本次读数 |
| last_reading | decimal | 10,2 | 是 | 否 | 上次读数 |
| water_usage | decimal | 10,2 | 是 | 否 | 用水量 |
| reading_type | tinyint | 4 | 是 | 否 | 抄表类型(1人工,2远传,3用户自报) |
| reader_id | bigint | 20 | 否 | 否 | 抄表员ID |
| status | tinyint | 4 | 是 | 否 | 状态(0正常,1异常,2已确认) |
| remark | varchar | 500 | 否 | 否 | 备注 |
| photo_url | varchar | 255 | 否 | 否 | 水表照片URL |
| creator | varchar | 64 | 否 | 否 | 创建者 |
| create_time | datetime | - | 是 | 否 | 创建时间 |
| updater | varchar | 64 | 否 | 否 | 更新者 |
| update_time | datetime | - | 是 | 否 | 更新时间 |
| deleted | bit | 1 | 是 | 否 | 是否删除 |
##### WATER_BILLING (水费账单表)
| 字段名 | 数据类型 | 长度 | 是否必填 | 主键 | 说明 |
|-------|---------|------|---------|-----|------|
| id | bigint | 20 | 是 | 是 | 账单ID |
| bill_no | varchar | 50 | 是 | 否 | 账单编号 |
| customer_id | bigint | 20 | 是 | 否 | 客户ID |
| meter_id | bigint | 20 | 是 | 否 | 水表ID |
| meter_reading_id | bigint | 20 | 是 | 否 | 抄表记录ID |
| billing_period | varchar | 20 | 是 | 否 | 账单周期(yyyyMM) |
| billing_date | date | - | 是 | 否 | 账单日期 |
| water_usage | decimal | 10,2 | 是 | 否 | 用水量 |
| water_fee | decimal | 10,2 | 是 | 否 | 水费金额 |
| sewage_fee | decimal | 10,2 | 是 | 否 | 污水处理费 |
| other_fee | decimal | 10,2 | 否 | 否 | 其他费用 |
| total_amount | decimal | 10,2 | 是 | 否 | 总金额 |
| due_date | date | - | 是 | 否 | 缴费截止日期 |
| status | tinyint | 4 | 是 | 否 | 状态(0未缴费,1已缴费,2部分缴费,3已逾期) |
| remark | varchar | 500 | 否 | 否 | 备注 |
| creator | varchar | 64 | 否 | 否 | 创建者 |
| create_time | datetime | - | 是 | 否 | 创建时间 |
| updater | varchar | 64 | 否 | 否 | 更新者 |
| update_time | datetime | - | 是 | 否 | 更新时间 |
| deleted | bit | 1 | 是 | 否 | 是否删除 |
## 四、数据库优化设计
### 1. 索引设计策略
- **主键索引**: 每个表都有自增主键
- **外键索引**: 对引用外键的字段创建索引
- **唯一索引**: 对唯一性字段创建唯一索引
- **复合索引**: 对常用查询条件组合创建复合索引
- **覆盖索引**: 针对高频查询设计覆盖索引减少回表操作
### 2. 分表策略
针对大表采用如下分表策略:
- **水表读数表(WATER_METER_READING)**: 按年份分表如WATER_METER_READING_2023
- **水费账单表(WATER_BILLING)**: 按年份分表如WATER_BILLING_2023
- **支付记录表(WATER_PAYMENT)**: 按年份分表如WATER_PAYMENT_2023
- **系统日志表(SYS_OPERATE_LOG)**: 按月份分表如SYS_OPERATE_LOG_202305
### 3. 缓存策略
采用Redis缓存以下数据:
- **系统字典**: 缓存系统字典数据,减少数据库查询
- **用户权限**: 缓存用户权限数据,提高权限验证效率
- **热点数据**: 缓存常用查询结果,如水价信息、客户基本信息
- **计数器**: 缓存计数器数据,如未读消息数、待办任务数
## 五、数据库安全设计
### 1. 访问控制
- **最小权限原则**: 应用连接数据库账号仅分配必要的操作权限
- **账号隔离**: 按模块分配不同的数据库账号
- **IP限制**: 限制数据库服务器访问IP
- **加密连接**: 使用SSL/TLS加密数据库连接
### 2. 数据加密
- **敏感数据加密**: 对身份证号、银行账号等敏感信息进行加密存储
- **传输加密**: 数据传输过程加密
- **密码加盐哈希**: 用户密码采用加盐哈希后存储
### 3. 审计日志
- **操作审计**: 记录数据库关键操作日志
- **登录审计**: 记录数据库登录日志
- **变更审计**: 记录重要数据变更日志
## 六、数据备份与恢复
### 1. 备份策略
- **全量备份**: 每天凌晨进行一次全量备份
- **增量备份**: 每小时进行一次增量备份
- **归档日志**: 开启binlog日志支持按时间点恢复
- **备份校验**: 定期检查备份数据完整性
### 2. 恢复策略
- **即时恢复**: 支持基于binlog的即时点恢复
- **快速恢复**: 设计快速恢复方案,明确恢复步骤和责任人
- **恢复演练**: 定期进行数据恢复演练,验证备份有效性
## 七、数据库监控与维护
### 1. 性能监控
- **指标监控**: CPU使用率、内存使用、磁盘IO、连接数等
- **慢查询分析**: 监控并分析慢查询日志
- **资源使用分析**: 分析数据库资源使用情况
### 2. 定期维护
- **碎片整理**: 定期进行表碎片整理
- **统计信息更新**: 定期更新统计信息
- **参数优化**: 根据运行情况优化数据库参数