272 lines
11 KiB
Markdown
272 lines
11 KiB
Markdown
# 福建水务营收系统数据库设计
|
||
|
||
## 一、数据库设计概述
|
||
|
||
福建水务营收系统采用关系型数据库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. 定期维护
|
||
|
||
- **碎片整理**: 定期进行表碎片整理
|
||
- **统计信息更新**: 定期更新统计信息
|
||
- **参数优化**: 根据运行情况优化数据库参数 |