--- title: "water_biz_database_design" author: "系统设计团队" date: "2024年12月19日" documentclass: article geometry: margin=1in fontsize: 11pt mainfont: "PingFang SC" CJKmainfont: "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** ![图表 1](temp_mermaid_water_biz_database_design_35098/diagram_1.png) ### 多租户架构设计 **图表 2** ![图表 2](temp_mermaid_water_biz_database_design_35098/diagram_2.png) ### 通用字段设计 所有业务表统一包含以下基础字段: | 字段名 | 数据类型 | 长度 | 描述 | |-------|---------|------|-----| | id | BIGINT | - | 主键ID | | tenant_id | BIGINT | - | 租户ID(多租户隔离) | | creator | VARCHAR | 64 | 创建者 | | create_time | DATETIME | - | 创建时间 | | updater | VARCHAR | 64 | 更新者 | | update_time | DATETIME | - | 更新时间 | | deleted | BIT | 1 | 逻辑删除标识 | ## 核心数据模型设计 ### 客户管理模块ER图 **图表 3** ![图表 3](temp_mermaid_water_biz_database_design_35098/diagram_3.png) ### 营收管理模块ER图 **图表 4** ![图表 4](temp_mermaid_water_biz_database_design_35098/diagram_4.png) ### 表务管理模块ER图 **图表 5** ![图表 5](temp_mermaid_water_biz_database_design_35098/diagram_5.png) ### 系统管理模块ER图 **图表 6** ![图表 6](temp_mermaid_water_biz_database_design_35098/diagram_6.png) ## 核心数据表设计 ### 表务管理模块ER图 **图表 7** ![图表 7](temp_mermaid_water_biz_database_design_35098/diagram_7.png) ### 系统管理模块ER图 **图表 8** ![图表 8](temp_mermaid_water_biz_database_design_35098/diagram_8.png) ## 数据表结构设计 ### 客户管理相关表 #### 客户基本信息表 (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国产密码算法 - **密码合规**:符合国家密码管理局相关要求 - **安全认证**:通过相关安全产品认证 #### 等保合规 - **等保三级**:满足等保三级安全防护要求 - **安全管理**:建立完善的安全管理制度 - **技术防护**:采用多层次的技术防护措施