14 KiB
14 KiB
福建水务业务系统数据库设计
目录
1. 数据库设计概述
福建水务业务系统的数据库设计基于MySQL/MariaDB数据库管理系统(同时支持国产OpenGauss数据库),采用关系型数据库模型,以支持业务系统的高并发、高可靠性需求。数据库设计遵循标准化、安全性、扩展性和性能优化的原则,为业务系统提供稳定、高效的数据存储和访问支持。
1.1 设计目标
- 支持系统功能需求,满足业务处理的数据需求
- 优化数据库性能,支持高并发访问
- 确保数据安全性,防止数据泄露和丢失
- 支持系统横向扩展,适应业务增长需求
- 支持多租户架构,实现数据隔离
1.2 设计原则
- 规范化设计:遵循数据库设计的第三范式,减少数据冗余
- 适度冗余:对于常用查询,适度保留冗余字段,提高查询效率
- 模块化:按业务模块划分表组,便于维护和扩展
- 安全性:设计完善的权限控制和数据加密方案
- 可扩展性:预留扩展字段,支持业务功能的扩展
- 通用字段:遵循RuoYi-Vue-Pro框架规范,统一基础字段定义
2. 数据库架构
2.1 总体架构
系统采用集中式数据库架构,主要包含以下组件:
- 主数据库:MySQL/MariaDB主从架构,存储核心业务数据,支持事务处理
- 报表数据库:存储统计分析数据,支持复杂查询和报表生成
- 历史数据库:存储历史业务数据,减轻主数据库负担
- 缓存系统:使用Redis作为缓存数据库,缓存热点数据,提高访问效率
2.2 多租户设计
系统采用基于字段的方式实现多租户架构,主要包括:
- 共享数据库,共享模式:所有租户共享同一数据库实例和表结构
- 租户标识列:在每个表中增加tenant_id租户标识列,实现数据隔离
- 多租户拦截器:基于MyBatis Plus的多租户拦截器,自动为SQL添加租户条件
- 权限控制:通过数据权限控制租户对数据的访问
2.3 数据访问层设计
系统基于MyBatis Plus框架实现数据访问层,主要特点包括:
- 通用CRUD:利用MyBatis Plus提供的BaseMapper,简化基础CRUD操作
- 分页查询:使用MyBatis Plus的分页插件,实现高性能分页
- 条件构造器:使用LambdaQueryWrapper/LambdaUpdateWrapper构建动态SQL
- 自动填充:通过MetaObjectHandler自动填充创建时间、更新时间等字段
- 乐观锁:支持通过版本号实现乐观锁控制
- 数据权限:通过自定义拦截器实现数据权限过滤
- 多租户:基于TenantLineInnerInterceptor实现多租户数据隔离
2.4 通用字段设计
系统中所有业务表都包含以下通用字段:
| 字段名 | 数据类型 | 长度 | 是否为空 | 描述 |
|---|---|---|---|---|
| id | BIGINT | - | 否 | 主键ID |
| creator | VARCHAR | 64 | 是 | 创建者 |
| create_time | DATETIME | - | 否 | 创建时间 |
| updater | VARCHAR | 64 | 是 | 更新者 |
| update_time | DATETIME | - | 是 | 更新时间 |
| deleted | TINYINT | 1 | 否 | 是否删除(0正常,1删除) |
| tenant_id | BIGINT | - | 否 | 租户ID |
| version | INT | - | 是 | 乐观锁版本号 |
3. 主要数据实体
系统主要包含以下核心数据实体:
3.1 客户实体
- 客户基本信息:存储客户的基本资料
- 表卡信息:存储水表基本信息和安装位置
- 账户信息:存储客户账户信息和余额
- 联系人信息:存储客户联系人信息
3.2 营收实体
- 抄表记录:存储水表抄读记录
- 账单信息:存储客户水费账单
- 缴费记录:存储客户缴费记录
- 调价记录:存储水价调整记录
3.3 表务实体
- 水表档案:存储水表的完整信息和生命周期
- 表务工单:存储表务作业工单信息
- 仓库信息:存储水表仓库信息
- 出入库记录:存储水表出入库记录
3.4 报装实体
- 报装申请:存储新用户报装申请信息
- 报装工单:存储报装作业工单信息
- 施工记录:存储报装施工记录
- 验收记录:存储报装验收记录
3.5 系统管理实体
- 组织机构:存储系统组织机构信息
- 用户信息:存储系统用户信息
- 角色权限:存储系统角色和权限信息
- 系统日志:存储系统操作日志
4. 表结构设计
以下是系统主要表结构设计,按业务模块划分:
4.1 客户管理相关表
4.1.1 客户基本信息表(TB_CUSTOMER)
| 字段名 | 数据类型 | 长度 | 是否为空 | 主键 | 描述 |
|---|---|---|---|---|---|
| CUSTOMER_ID | VARCHAR | 20 | 否 | 是 | 客户编号,主键 |
| TENANT_ID | VARCHAR | 20 | 否 | 否 | 租户标识 |
| CUSTOMER_NAME | VARCHAR | 100 | 否 | 否 | 客户名称 |
| CUSTOMER_TYPE | VARCHAR | 10 | 否 | 否 | 客户类型 |
| ID_TYPE | VARCHAR | 10 | 是 | 否 | 证件类型 |
| ID_NUMBER | VARCHAR | 30 | 是 | 否 | 证件号码 |
| PHONE | VARCHAR | 20 | 是 | 否 | 联系电话 |
| ADDRESS | VARCHAR | 200 | 是 | 否 | 地址 |
| AREA_CODE | VARCHAR | 20 | 是 | 否 | 行政区划代码 |
| CREATE_TIME | DATETIME | - | 否 | 否 | 创建时间 |
| UPDATE_TIME | DATETIME | - | 是 | 否 | 更新时间 |
| STATUS | VARCHAR | 10 | 否 | 否 | 状态 |
4.1.2 表卡信息表(TB_METER_INFO)
| 字段名 | 数据类型 | 长度 | 是否为空 | 主键 | 描述 |
|---|---|---|---|---|---|
| METER_ID | VARCHAR | 20 | 否 | 是 | 水表编号,主键 |
| CUSTOMER_ID | VARCHAR | 20 | 否 | 否 | 客户编号,外键 |
| TENANT_ID | VARCHAR | 20 | 否 | 否 | 租户标识 |
| METER_NO | VARCHAR | 30 | 否 | 否 | 水表号 |
| METER_TYPE | VARCHAR | 10 | 否 | 否 | 水表类型 |
| METER_MODEL | VARCHAR | 20 | 是 | 否 | 水表型号 |
| METER_CALIBER | VARCHAR | 10 | 是 | 否 | 水表口径 |
| INSTALL_DATE | DATE | - | 是 | 否 | 安装日期 |
| INSTALL_POSITION | VARCHAR | 200 | 是 | 否 | 安装位置 |
| INITIAL_READING | DECIMAL | 10,2 | 否 | 否 | 初始读数 |
| CURRENT_READING | DECIMAL | 10,2 | 否 | 否 | 当前读数 |
| READING_CYCLE | VARCHAR | 10 | 否 | 否 | 抄表周期 |
| BOOK_ID | VARCHAR | 20 | 是 | 否 | 册本编号 |
| STATUS | VARCHAR | 10 | 否 | 否 | 状态 |
| CREATE_TIME | DATETIME | - | 否 | 否 | 创建时间 |
| UPDATE_TIME | DATETIME | - | 是 | 否 | 更新时间 |
4.1.3 账户信息表(TB_ACCOUNT)
| 字段名 | 数据类型 | 长度 | 是否为空 | 主键 | 描述 |
|---|---|---|---|---|---|
| ACCOUNT_ID | VARCHAR | 20 | 否 | 是 | 账户编号,主键 |
| CUSTOMER_ID | VARCHAR | 20 | 否 | 否 | 客户编号,外键 |
| TENANT_ID | VARCHAR | 20 | 否 | 否 | 租户标识 |
| BALANCE | DECIMAL | 12,2 | 否 | 否 | 账户余额 |
| CREDIT_AMOUNT | DECIMAL | 12,2 | 是 | 否 | 信用额度 |
| LAST_PAYMENT_DATE | DATE | - | 是 | 否 | 最近缴费日期 |
| STATUS | VARCHAR | 10 | 否 | 否 | 状态 |
| CREATE_TIME | DATETIME | - | 否 | 否 | 创建时间 |
| UPDATE_TIME | DATETIME | - | 是 | 否 | 更新时间 |
4.2 营收管理相关表
4.2.1 抄表记录表(TB_METER_READING)
| 字段名 | 数据类型 | 长度 | 是否为空 | 主键 | 描述 |
|---|---|---|---|---|---|
| READING_ID | VARCHAR | 20 | 否 | 是 | 抄表记录编号,主键 |
| METER_ID | VARCHAR | 20 | 否 | 否 | 水表编号,外键 |
| TENANT_ID | VARCHAR | 20 | 否 | 否 | 租户标识 |
| READING_DATE | DATE | - | 否 | 否 | 抄表日期 |
| READING_VALUE | DECIMAL | 10,2 | 否 | 否 | 抄表读数 |
| PREV_READING_VALUE | DECIMAL | 10,2 | 是 | 否 | 上次读数 |
| WATER_USAGE | DECIMAL | 10,2 | 否 | 否 | 用水量 |
| READING_TYPE | VARCHAR | 10 | 否 | 否 | 抄表类型(人工/远传/自报) |
| READER_ID | VARCHAR | 20 | 是 | 否 | 抄表员编号 |
| STATUS | VARCHAR | 10 | 否 | 否 | 状态 |
| REMARK | VARCHAR | 200 | 是 | 否 | 备注 |
| CREATE_TIME | DATETIME | - | 否 | 否 | 创建时间 |
| UPDATE_TIME | DATETIME | - | 是 | 否 | 更新时间 |
4.2.2 账单信息表(TB_BILL)
| 字段名 | 数据类型 | 长度 | 是否为空 | 主键 | 描述 |
|---|---|---|---|---|---|
| BILL_ID | VARCHAR | 20 | 否 | 是 | 账单编号,主键 |
| CUSTOMER_ID | VARCHAR | 20 | 否 | 否 | 客户编号,外键 |
| METER_ID | VARCHAR | 20 | 否 | 否 | 水表编号,外键 |
| READING_ID | VARCHAR | 20 | 是 | 否 | 抄表记录编号,外键 |
| TENANT_ID | VARCHAR | 20 | 否 | 否 | 租户标识 |
| BILL_MONTH | VARCHAR | 7 | 否 | 否 | 账期(格式:YYYY-MM) |
| WATER_USAGE | DECIMAL | 10,2 | 否 | 否 | 用水量 |
| WATER_FEE | DECIMAL | 10,2 | 否 | 否 | 水费金额 |
| OTHER_FEE | DECIMAL | 10,2 | 是 | 否 | 其他费用 |
| TOTAL_AMOUNT | DECIMAL | 10,2 | 否 | 否 | 总金额 |
| DUE_DATE | DATE | - | 否 | 否 | 缴费截止日期 |
| STATUS | VARCHAR | 10 | 否 | 否 | 状态 |
| CREATE_TIME | DATETIME | - | 否 | 否 | 创建时间 |
| UPDATE_TIME | DATETIME | - | 是 | 否 | 更新时间 |
4.2.3 缴费记录表(TB_PAYMENT)
| 字段名 | 数据类型 | 长度 | 是否为空 | 主键 | 描述 |
|---|---|---|---|---|---|
| PAYMENT_ID | VARCHAR | 20 | 否 | 是 | 缴费记录编号,主键 |
| BILL_ID | VARCHAR | 20 | 是 | 否 | 账单编号,外键 |
| CUSTOMER_ID | VARCHAR | 20 | 否 | 否 | 客户编号,外键 |
| TENANT_ID | VARCHAR | 20 | 否 | 否 | 租户标识 |
| PAYMENT_TYPE | VARCHAR | 10 | 否 | 否 | 缴费类型 |
| PAYMENT_CHANNEL | VARCHAR | 10 | 否 | 否 | 缴费渠道 |
| PAYMENT_AMOUNT | DECIMAL | 10,2 | 否 | 否 | 缴费金额 |
| PAYMENT_DATE | DATETIME | - | 否 | 否 | 缴费时间 |
| TRANSACTION_NO | VARCHAR | 30 | 是 | 否 | 交易流水号 |
| OPERATOR_ID | VARCHAR | 20 | 是 | 否 | 操作员编号 |
| STATUS | VARCHAR | 10 | 否 | 否 | 状态 |
| REMARK | VARCHAR | 200 | 是 | 否 | 备注 |
| CREATE_TIME | DATETIME | - | 否 | 否 | 创建时间 |
| UPDATE_TIME | DATETIME | - | 是 | 否 | 更新时间 |
4.3 表务管理相关表
4.3.1 水表档案表(TB_METER_ARCHIVE)
| 字段名 | 数据类型 | 长度 | 是否为空 | 主键 | 描述 |
|---|---|---|---|---|---|
| METER_ARCHIVE_ID | VARCHAR | 20 | 否 | 是 | 水表档案编号,主键 |
| METER_ID | VARCHAR | 20 | 否 | 否 | 水表编号,外键 |
| TENANT_ID | VARCHAR | 20 | 否 | 否 | 租户标识 |
| FACTORY | VARCHAR | 50 | 是 | 否 | 生产厂家 |
| PRODUCTION_DATE | DATE | - | 是 | 否 | 生产日期 |
| VALID_PERIOD | INT | - | 是 | 否 | 有效期(月) |
| VERIFICATION_DATE | DATE | - | 是 | 否 | 检定日期 |
| NEXT_VERIFICATION_DATE | DATE | - | 是 | 否 | 下次检定日期 |
| STATUS | VARCHAR | 10 | 否 | 否 | 状态 |
| CREATE_TIME | DATETIME | - | 否 | 否 | 创建时间 |
| UPDATE_TIME | DATETIME | - | 是 | 否 | 更新时间 |
4.3.2 表务工单表(TB_METER_WORKORDER)
| 字段名 | 数据类型 | 长度 | 是否为空 | 主键 | 描述 |
|---|---|---|---|---|---|
| WORKORDER_ID | VARCHAR | 20 | 否 | 是 | 工单编号,主键 |
| METER_ID | VARCHAR | 20 | 否 | 否 | 水表编号,外键 |
| CUSTOMER_ID | VARCHAR | 20 | 否 | 否 | 客户编号,外键 |
| TENANT_ID | VARCHAR | 20 | 否 | 否 | 租户标识 |
| WORKORDER_TYPE | VARCHAR | 10 | 否 | 否 | 工单类型 |
| WORKORDER_STATUS | VARCHAR | 10 | 否 | 否 | 工单状态 |
| APPLY_DATE | DATE | - | 否 | 否 | 申请日期 |
| PLAN_DATE | DATE | - | 是 | 否 | 计划执行日期 |
| EXECUTE_DATE | DATE | - | 是 | 否 | 实际执行日期 |
| APPLICANT_ID | VARCHAR | 20 | 是 | 否 | 申请人编号 |
| EXECUTOR_ID | VARCHAR | 20 | 是 | 否 | 执行人编号 |
| REASON | VARCHAR | 200 | 是 | 否 | 原因 |
| RESULT | VARCHAR | 200 | 是 | 否 | 结果 |
| CREATE_TIME | DATETIME | - | 否 | 否 | 创建时间 |
| UPDATE_TIME | DATETIME | - | 是 | 否 | 更新时间 |
5. 索引设计
为提高系统性能,针对主要查询场景设计了以下索引:
5.1 主键索引
- 所有表的主键字段均建立主键索引
5.2 外键索引
- 表关联字段建立外键索引,如 CUSTOMER_ID, METER_ID 等
5.3 常用查询字段索引
- 客户表:CUSTOMER_NAME, PHONE, ID_NUMBER
- 水表表:METER_NO, BOOK_ID
- 账单表:BILL_MONTH, STATUS
- 缴费表:PAYMENT_DATE, TRANSACTION_NO
- 抄表表:READING_DATE
5.4 复合索引
- 客户表:(TENANT_ID, CUSTOMER_TYPE)
- 账单表:(TENANT_ID, CUSTOMER_ID, BILL_MONTH)
- 抄表表:(TENANT_ID, METER_ID, READING_DATE)
6. 数据安全性设计
6.1 数据加密
- 敏感个人信息(如身份证号码、银行账号等)采用加密存储
- 加密算法采用 AES-256 或同等安全级别的加密方式
6.2 权限控制
- 采用基于角色的访问控制(RBAC)模型
- 对不同角色用户设置不同的数据访问权限
- 实现行级、列级的细粒度权限控制
6.3 数据备份与恢复
- 定期全量备份,每日增量备份
- 异地数据灾备,确保数据安全
- 完善的数据恢复机制,支持按时间点恢复
6.4 数据审计
- 关键业务操作的数据变更记录
- 敏感数据访问日志记录
- 数据异常访问监控与告警