福建水务营收系统数据库设计
一、数据库设计概述
福建水务营收系统采用关系型数据库MySQL作为主要存储系统,结合Redis缓存提升性能。数据库设计遵循标准化原则,确保数据完整性、一致性和高效性。
二、数据库架构设计
1. 数据库架构图
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图)
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. 定期维护
- 碎片整理: 定期进行表碎片整理
- 统计信息更新: 定期更新统计信息
- 参数优化: 根据运行情况优化数据库参数