fujian_water_biz_doc/water_biz_database_design.md

11 KiB
Raw Blame History

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

一、数据库设计概述

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

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