# 福建水务营收系统数据库设计

## 一、数据库设计概述

福建水务营收系统采用关系型数据库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. 定期维护

- **碎片整理**: 定期进行表碎片整理
- **统计信息更新**: 定期更新统计信息
- **参数优化**: 根据运行情况优化数据库参数 