title, author, date, documentclass, geometry, fontsize, mainfont, CJKmainfont
| title |
author |
date |
documentclass |
geometry |
fontsize |
mainfont |
CJKmainfont |
| water_biz_database_design |
系统设计团队 |
2024年12月19日 |
article |
margin=1in |
11pt |
PingFang SC |
PingFang SC |
福建水务营收系统数据库设计文档
文档信息
| 项目信息 |
详情 |
| 项目名称 |
福建水务营收系统 |
| 文档类型 |
概要设计文档 |
| 技术框架 |
RuoYi-Vue-Pro + yudao-ui-admin-vue3 |
| 文档版本 |
v1.0 |
| 编写日期 |
2024-12-19 |
| 文档状态 |
✅ 已完成 |
目录
数据库设计概述
福建水务营收系统采用**华为OpenGauss 5.0+**数据库,基于RuoYi-Vue-Pro框架规范设计。OpenGauss作为国产自主可控的企业级数据库,具有高性能、高可用、高安全的特点,完全满足水务行业对数据安全和国产化的要求。
设计目标
- 支持100万客户的业务量,满足3-5年业务发展需求
- 支持200并发用户,50并发移动设备
- 系统响应时间不超过3秒
- 数据安全等保三级要求
- 支持多租户数据隔离
- 国产化要求:符合国产数据库替代要求
数据库选型优势
- 国产自主可控:华为OpenGauss是完全自主知识产权的数据库
- 高性能:优化的SQL引擎,查询性能优于传统数据库20-30%
- 高可用:支持主备同步、读写分离、故障自动切换
- 安全可信:内置数据加密、审计、权限管控等安全特性
- 生态兼容:兼容PostgreSQL/MySQL协议,迁移成本低
设计原则
- 标准化:遵循OpenGauss数据库设计规范
- 多租户:基于tenant_id字段实现数据隔离
- 可扩展:预留扩展字段,支持业务增长
- 高性能:合理设计索引,优化查询性能
- 安全性:利用OpenGauss内置安全特性
数据库架构
数据库架构图
图表 1

多租户架构设计
图表 2

通用字段设计
所有业务表统一包含以下基础字段:
| 字段名 |
数据类型 |
长度 |
描述 |
| id |
BIGINT |
- |
主键ID |
| tenant_id |
BIGINT |
- |
租户ID(多租户隔离) |
| creator |
VARCHAR |
64 |
创建者 |
| create_time |
DATETIME |
- |
创建时间 |
| updater |
VARCHAR |
64 |
更新者 |
| update_time |
DATETIME |
- |
更新时间 |
| deleted |
BIT |
1 |
逻辑删除标识 |
核心数据模型设计
客户管理模块ER图
图表 3

营收管理模块ER图
图表 4

表务管理模块ER图
图表 5

系统管理模块ER图
图表 6

核心数据表设计
表务管理模块ER图
图表 7

系统管理模块ER图
图表 8

数据表结构设计
客户管理相关表
客户基本信息表 (water_customer)
| 字段名 |
数据类型 |
长度 |
主键 |
非空 |
默认值 |
说明 |
| id |
BIGINT |
- |
Y |
Y |
AUTO_INCREMENT |
主键ID |
| customer_code |
VARCHAR |
32 |
- |
Y |
- |
客户编号 |
| customer_name |
VARCHAR |
100 |
- |
Y |
- |
客户名称 |
| customer_type |
VARCHAR |
20 |
- |
Y |
- |
客户类型 |
| id_type |
VARCHAR |
20 |
- |
N |
NULL |
证件类型 |
| id_number |
VARCHAR |
30 |
- |
N |
NULL |
证件号码 |
| phone |
VARCHAR |
20 |
- |
N |
NULL |
联系电话 |
| mobile |
VARCHAR |
20 |
- |
N |
NULL |
手机号码 |
| email |
VARCHAR |
100 |
- |
N |
NULL |
邮箱 |
| address |
VARCHAR |
500 |
- |
N |
NULL |
详细地址 |
| area_code |
VARCHAR |
20 |
- |
N |
NULL |
行政区划代码 |
| status |
TINYINT |
- |
- |
Y |
1 |
状态(0:停用,1:正常,2:欠费,3:销户) |
| tenant_id |
BIGINT |
- |
- |
Y |
0 |
租户ID |
水表信息表 (water_meter)
| 字段名 |
数据类型 |
长度 |
主键 |
非空 |
默认值 |
说明 |
| id |
BIGINT |
- |
Y |
Y |
AUTO_INCREMENT |
主键ID |
| meter_code |
VARCHAR |
32 |
- |
Y |
- |
水表编号 |
| meter_no |
VARCHAR |
30 |
- |
N |
NULL |
水表表号 |
| meter_type |
VARCHAR |
20 |
- |
Y |
- |
水表类型 |
| meter_model |
VARCHAR |
50 |
- |
N |
NULL |
水表型号 |
| meter_caliber |
VARCHAR |
10 |
- |
N |
NULL |
水表口径 |
| manufacturer |
VARCHAR |
100 |
- |
N |
NULL |
生产厂家 |
| install_date |
DATE |
- |
- |
N |
NULL |
安装日期 |
| install_position |
VARCHAR |
500 |
- |
N |
NULL |
安装位置 |
| initial_reading |
DECIMAL |
10,2 |
- |
Y |
0.00 |
初始读数 |
| current_reading |
DECIMAL |
10,2 |
- |
Y |
0.00 |
当前读数 |
| reading_cycle |
VARCHAR |
20 |
- |
Y |
MONTHLY |
抄表周期 |
| book_code |
VARCHAR |
32 |
- |
N |
NULL |
册本编号 |
| meter_status |
TINYINT |
- |
- |
Y |
1 |
水表状态 |
| customer_id |
BIGINT |
- |
- |
Y |
- |
客户ID |
| tenant_id |
BIGINT |
- |
- |
Y |
0 |
租户ID |
客户账户表 (water_customer_account)
| 字段名 |
数据类型 |
长度 |
主键 |
非空 |
默认值 |
说明 |
| id |
BIGINT |
- |
Y |
Y |
AUTO_INCREMENT |
主键ID |
| account_code |
VARCHAR |
32 |
- |
Y |
- |
账户编号 |
| balance |
DECIMAL |
12,2 |
- |
Y |
0.00 |
账户余额 |
| credit_amount |
DECIMAL |
12,2 |
- |
N |
0.00 |
信用额度 |
| deposit_amount |
DECIMAL |
12,2 |
- |
N |
0.00 |
保证金 |
| frozen_amount |
DECIMAL |
12,2 |
- |
N |
0.00 |
冻结金额 |
| last_payment_date |
DATE |
- |
- |
N |
NULL |
最近缴费日期 |
| arrears_amount |
DECIMAL |
12,2 |
- |
N |
0.00 |
欠费金额 |
| account_status |
TINYINT |
- |
- |
Y |
1 |
账户状态 |
| customer_id |
BIGINT |
- |
- |
Y |
- |
客户ID |
| tenant_id |
BIGINT |
- |
- |
Y |
0 |
租户ID |
营收管理相关表
抄表记录表 (water_meter_reading)
| 字段名 |
数据类型 |
长度 |
主键 |
非空 |
默认值 |
说明 |
| id |
BIGINT |
- |
Y |
Y |
AUTO_INCREMENT |
主键ID |
| reading_code |
VARCHAR |
32 |
- |
Y |
- |
抄表记录编号 |
| reading_date |
DATE |
- |
- |
Y |
- |
抄表日期 |
| reading_value |
DECIMAL |
10,2 |
- |
Y |
- |
抄表读数 |
| prev_reading_value |
DECIMAL |
10,2 |
- |
N |
NULL |
上次读数 |
| water_usage |
DECIMAL |
10,2 |
- |
Y |
0.00 |
用水量 |
| reading_type |
VARCHAR |
20 |
- |
Y |
- |
抄表类型 |
| reader_id |
VARCHAR |
20 |
- |
N |
NULL |
抄表员ID |
| reading_status |
TINYINT |
- |
- |
Y |
0 |
状态 |
| meter_id |
BIGINT |
- |
- |
Y |
- |
水表ID |
| customer_id |
BIGINT |
- |
- |
Y |
- |
客户ID |
| tenant_id |
BIGINT |
- |
- |
Y |
0 |
租户ID |
水费账单表 (water_bill)
| 字段名 |
数据类型 |
长度 |
主键 |
非空 |
默认值 |
说明 |
| id |
BIGINT |
- |
Y |
Y |
AUTO_INCREMENT |
主键ID |
| bill_code |
VARCHAR |
32 |
- |
Y |
- |
账单编号 |
| bill_month |
VARCHAR |
7 |
- |
Y |
- |
账期 |
| bill_date |
DATE |
- |
- |
Y |
- |
开账日期 |
| water_usage |
DECIMAL |
10,2 |
- |
Y |
0.00 |
用水量 |
| water_fee |
DECIMAL |
10,2 |
- |
Y |
0.00 |
水费金额 |
| sewage_fee |
DECIMAL |
10,2 |
- |
N |
0.00 |
污水处理费 |
| other_fee |
DECIMAL |
10,2 |
- |
N |
0.00 |
其他费用 |
| total_amount |
DECIMAL |
10,2 |
- |
Y |
0.00 |
总金额 |
| due_date |
DATE |
- |
- |
Y |
- |
缴费截止日期 |
| bill_status |
TINYINT |
- |
- |
Y |
0 |
账单状态 |
| customer_id |
BIGINT |
- |
- |
Y |
- |
客户ID |
| meter_id |
BIGINT |
- |
- |
Y |
- |
水表ID |
| reading_id |
BIGINT |
- |
- |
N |
NULL |
抄表记录ID |
| tenant_id |
BIGINT |
- |
- |
Y |
0 |
租户ID |
缴费记录表 (water_payment)
| 字段名 |
数据类型 |
长度 |
主键 |
非空 |
默认值 |
说明 |
| id |
BIGINT |
- |
Y |
Y |
AUTO_INCREMENT |
主键ID |
| payment_code |
VARCHAR |
32 |
- |
Y |
- |
缴费记录编号 |
| payment_type |
VARCHAR |
20 |
- |
Y |
- |
缴费类型 |
| payment_channel |
VARCHAR |
20 |
- |
Y |
- |
缴费渠道 |
| payment_amount |
DECIMAL |
10,2 |
- |
Y |
- |
缴费金额 |
| payment_time |
DATETIME |
- |
- |
Y |
- |
缴费时间 |
| transaction_no |
VARCHAR |
50 |
- |
N |
NULL |
交易流水号 |
| operator_id |
VARCHAR |
20 |
- |
N |
NULL |
操作员ID |
| payment_status |
TINYINT |
- |
- |
Y |
1 |
缴费状态 |
| bill_id |
BIGINT |
- |
- |
N |
NULL |
账单ID |
| customer_id |
BIGINT |
- |
- |
Y |
- |
客户ID |
| tenant_id |
BIGINT |
- |
- |
Y |
0 |
租户ID |
表务管理相关表
水表档案表 (water_meter_archive)
| 字段名 |
数据类型 |
长度 |
主键 |
非空 |
默认值 |
说明 |
| id |
BIGINT |
- |
Y |
Y |
AUTO_INCREMENT |
主键ID |
| archive_code |
VARCHAR |
32 |
- |
Y |
- |
档案编号 |
| manufacturer |
VARCHAR |
100 |
- |
N |
NULL |
生产厂家 |
| production_date |
DATE |
- |
- |
N |
NULL |
生产日期 |
| valid_period |
INT |
- |
- |
N |
72 |
有效期(月) |
| verification_date |
DATE |
- |
- |
N |
NULL |
检定日期 |
| next_verification_date |
DATE |
- |
- |
N |
NULL |
下次检定日期 |
| certificate_no |
VARCHAR |
50 |
- |
N |
NULL |
检定证书号 |
| archive_status |
TINYINT |
- |
- |
Y |
1 |
档案状态 |
| meter_id |
BIGINT |
- |
- |
Y |
- |
水表ID |
| tenant_id |
BIGINT |
- |
- |
Y |
0 |
租户ID |
表务工单表 (water_meter_workorder)
| 字段名 |
数据类型 |
长度 |
主键 |
非空 |
默认值 |
说明 |
| id |
BIGINT |
- |
Y |
Y |
AUTO_INCREMENT |
主键ID |
| workorder_code |
VARCHAR |
32 |
- |
Y |
- |
工单编号 |
| workorder_type |
VARCHAR |
20 |
- |
Y |
- |
工单类型 |
| workorder_status |
VARCHAR |
20 |
- |
Y |
PENDING |
工单状态 |
| apply_date |
DATE |
- |
- |
Y |
- |
申请日期 |
| plan_date |
DATE |
- |
- |
N |
NULL |
计划执行日期 |
| execute_date |
DATE |
- |
- |
N |
NULL |
实际执行日期 |
| applicant_id |
VARCHAR |
20 |
- |
N |
NULL |
申请人ID |
| executor_id |
VARCHAR |
20 |
- |
N |
NULL |
执行人ID |
| reason |
VARCHAR |
500 |
- |
N |
NULL |
申请原因 |
| result |
VARCHAR |
500 |
- |
N |
NULL |
执行结果 |
| meter_id |
BIGINT |
- |
- |
Y |
- |
水表ID |
| customer_id |
BIGINT |
- |
- |
Y |
- |
客户ID |
| tenant_id |
BIGINT |
- |
- |
Y |
0 |
租户ID |
水表库存表 (water_meter_stock)
| 字段名 |
数据类型 |
长度 |
主键 |
非空 |
默认值 |
说明 |
| id |
BIGINT |
- |
Y |
Y |
AUTO_INCREMENT |
主键ID |
| stock_code |
VARCHAR |
32 |
- |
Y |
- |
库存编号 |
| meter_brand |
VARCHAR |
50 |
- |
Y |
- |
水表品牌 |
| meter_model |
VARCHAR |
50 |
- |
Y |
- |
水表型号 |
| meter_caliber |
VARCHAR |
10 |
- |
Y |
- |
水表口径 |
| stock_quantity |
INT |
- |
- |
Y |
0 |
库存数量 |
| min_stock |
INT |
- |
- |
Y |
0 |
最小库存 |
| unit_price |
DECIMAL |
10,2 |
- |
N |
NULL |
单价 |
| warehouse_location |
VARCHAR |
100 |
- |
N |
NULL |
仓库位置 |
| stock_status |
TINYINT |
- |
- |
Y |
1 |
库存状态 |
| tenant_id |
BIGINT |
- |
- |
Y |
0 |
租户ID |
系统管理相关表
数据字典类型表 (water_dict_type)
| 字段名 |
数据类型 |
长度 |
主键 |
非空 |
默认值 |
说明 |
| id |
BIGINT |
- |
Y |
Y |
AUTO_INCREMENT |
主键ID |
| dict_name |
VARCHAR |
100 |
- |
Y |
- |
字典名称 |
| dict_type |
VARCHAR |
100 |
- |
Y |
- |
字典类型 |
| remark |
VARCHAR |
500 |
- |
N |
NULL |
备注 |
| status |
TINYINT |
- |
- |
Y |
1 |
状态 |
| tenant_id |
BIGINT |
- |
- |
Y |
0 |
租户ID |
数据字典表 (water_dict_data)
| 字段名 |
数据类型 |
长度 |
主键 |
非空 |
默认值 |
说明 |
| id |
BIGINT |
- |
Y |
Y |
AUTO_INCREMENT |
主键ID |
| dict_type |
VARCHAR |
100 |
- |
Y |
- |
字典类型 |
| dict_label |
VARCHAR |
100 |
- |
Y |
- |
字典标签 |
| dict_value |
VARCHAR |
100 |
- |
Y |
- |
字典键值 |
| dict_sort |
INT |
- |
- |
Y |
0 |
字典排序 |
| status |
TINYINT |
- |
- |
Y |
1 |
状态 |
| tenant_id |
BIGINT |
- |
- |
Y |
0 |
租户ID |
系统配置表 (water_config)
| 字段名 |
数据类型 |
长度 |
主键 |
非空 |
默认值 |
说明 |
| id |
BIGINT |
- |
Y |
Y |
AUTO_INCREMENT |
主键ID |
| config_name |
VARCHAR |
100 |
- |
Y |
- |
参数名称 |
| config_key |
VARCHAR |
100 |
- |
Y |
- |
参数键名 |
| config_value |
VARCHAR |
500 |
- |
N |
NULL |
参数键值 |
| config_type |
VARCHAR |
20 |
- |
N |
NULL |
系统内置 |
| remark |
VARCHAR |
500 |
- |
N |
NULL |
备注 |
| tenant_id |
BIGINT |
- |
- |
Y |
0 |
租户ID |
水价配置表 (water_price_config)
| 字段名 |
数据类型 |
长度 |
主键 |
非空 |
默认值 |
说明 |
| id |
BIGINT |
- |
Y |
Y |
AUTO_INCREMENT |
主键ID |
| price_name |
VARCHAR |
100 |
- |
Y |
- |
水价名称 |
| customer_type |
VARCHAR |
20 |
- |
Y |
- |
客户类型 |
| price_type |
VARCHAR |
20 |
- |
Y |
- |
价格类型 |
| base_price |
DECIMAL |
8,4 |
- |
Y |
- |
基础价格 |
| sewage_price |
DECIMAL |
8,4 |
- |
N |
0.00 |
污水处理费 |
| effective_date |
DATE |
- |
- |
Y |
- |
生效日期 |
| expire_date |
DATE |
- |
- |
N |
NULL |
失效日期 |
| status |
TINYINT |
- |
- |
Y |
1 |
状态 |
| tenant_id |
BIGINT |
- |
- |
Y |
0 |
租户ID |
索引与性能优化
主要索引设计
唯一索引
- 客户编号索引:
uk_customer_code (customer_code, tenant_id)
- 水表编号索引:
uk_meter_code (meter_code, tenant_id)
- 账单编号索引:
uk_bill_code (bill_code, tenant_id)
- 缴费编号索引:
uk_payment_code (payment_code, tenant_id)
复合索引
- 多租户查询索引:
idx_tenant_customer_type (tenant_id, customer_type)
- 账单查询索引:
idx_tenant_customer_month (tenant_id, customer_id, bill_month)
- 抄表查询索引:
idx_tenant_meter_date (tenant_id, meter_id, reading_date)
- 缴费查询索引:
idx_customer_payment_time (customer_id, payment_time)
单列索引
- 状态查询索引:各表的状态字段
- 时间查询索引:创建时间、更新时间、缴费时间等
- 关联查询索引:外键字段
OpenGauss特性应用
分区表设计
- 按月分区:账单表、缴费表按月份分区
- 按年分区:历史数据表按年份分区
- 按租户分区:大租户数据独立分区
列存储优化
- 统计分析表:使用列存储提高分析查询性能
- 历史数据表:归档数据使用列存储节省空间
内存表应用
- 配置缓存表:系统配置参数使用内存表
- 字典数据表:频繁访问的字典数据使用内存表
查询优化策略
多租户查询优化
- 所有查询强制包含tenant_id条件
- 使用MyBatis Plus多租户拦截器自动添加租户条件
- 建立租户级别的分区索引
分页查询优化
- 使用覆盖索引减少回表查询
- 大数据量分页使用游标分页替代传统分页
- 配置合理的LIMIT和OFFSET参数
统计查询优化
- 建立专门的统计视图
- 使用物化视图缓存复杂统计结果
- 配置定期刷新统计信息
数据安全设计
OpenGauss安全特性
透明数据加密 (TDE)
- 表级加密:敏感数据表启用透明加密
- 字段级加密:身份证号、银行账号等敏感字段加密存储
- 密钥管理:使用OpenGauss内置密钥管理系统
行级安全策略 (RLS)
- 多租户隔离:基于tenant_id的行级安全策略
- 数据权限控制:根据用户角色限制数据访问范围
- 动态权限策略:支持基于时间、地域等条件的动态权限
动态数据脱敏
- 敏感数据脱敏:手机号、身份证号等敏感信息脱敏显示
- 角色权限控制:不同角色看到不同级别的脱敏数据
- 脱敏规则配置:支持灵活的脱敏规则配置
权限控制体系
角色权限设计
- 系统管理员:拥有所有权限,负责系统配置和用户管理
- 业务管理员:拥有业务数据的完整权限
- 业务操作员:拥有业务数据的查询和部分修改权限
- 只读用户:仅拥有脱敏数据的查询权限
多级权限控制
- 系统级权限:控制系统功能模块的访问权限
- 数据级权限:控制数据记录的访问权限
- 字段级权限:控制敏感字段的访问权限
- 操作级权限:控制增删改查等操作权限
审计与监控
操作审计
- 数据变更审计:记录所有数据增删改操作
- 敏感操作审计:重点审计敏感数据的访问操作
- 登录审计:记录用户登录、退出等认证操作
- 权限变更审计:记录权限和角色的变更操作
安全监控
- 异常访问监控:监控异常的数据访问行为
- 性能监控:监控数据库性能指标和资源使用情况
- 安全事件监控:监控安全相关事件和告警
- 合规检查:定期进行安全合规性检查
备份与恢复
数据备份策略
- 全量备份:定期进行完整数据库备份
- 增量备份:每日进行增量数据备份
- 归档备份:历史数据定期归档到备份存储
- 异地备份:关键数据进行异地备份
灾难恢复
- 主备同步:OpenGauss主备实时同步
- 故障切换:支持自动故障检测和切换
- 数据恢复:支持基于时间点的数据恢复
- 业务连续性:确保业务服务的高可用性
国产化安全合规
密码算法支持
- 国产SM算法:支持SM2/SM3/SM4国产密码算法
- 密码合规:符合国家密码管理局相关要求
- 安全认证:通过相关安全产品认证
等保合规
- 等保三级:满足等保三级安全防护要求
- 安全管理:建立完善的安全管理制度
- 技术防护:采用多层次的技术防护措施