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