# 福建水务营收系统数据库设计文档 ## 文档信息 | 项目信息 | 详情 | |---------|------| | **项目名称** | 福建水务营收系统 | | **文档类型** | 概要设计文档 | | **技术框架** | RuoYi-Vue-Pro + yudao-ui-admin-vue3 | | **文档版本** | v1.0 | | **编写日期** | 2024-12-19 | | **文档状态** | ✅ 已完成 | ## 目录 - [一、数据库设计概述](#一数据库设计概述) - [二、数据库架构](#二数据库架构) - [三、核心数据模型ER图](#三核心数据模型er图) - [四、核心数据表设计](#四核心数据表设计) - [五、完整DDL语句](#五完整ddl语句) - [六、OpenGauss数据库特性应用](#六opengauss数据库特性应用) - [七、索引设计与优化](#七索引设计与优化) - [八、OpenGauss数据安全设计](#八opengauss数据安全设计) ## 一、数据库设计概述 福建水务营收系统采用**华为OpenGauss 5.0+**数据库,基于RuoYi-Vue-Pro框架规范设计。OpenGauss作为国产自主可控的企业级数据库,具有高性能、高可用、高安全的特点,完全满足水务行业对数据安全和国产化的要求。数据库架构支持多租户、高并发、高可用的业务需求,为水务营收业务提供稳定可靠的数据存储服务。 ### 1.1 设计目标 - 支持100万客户的业务量,满足3-5年业务发展需求 - 支持200并发用户,50并发移动设备 - 系统响应时间不超过3秒 - 数据安全等保三级要求 - 支持多租户数据隔离 - **国产化要求**:符合国产数据库替代要求 ### 1.2 数据库选型优势 - **国产自主可控**:华为OpenGauss是完全自主知识产权的数据库 - **高性能**:优化的SQL引擎,查询性能优于传统数据库20-30% - **高可用**:支持主备同步、读写分离、故障自动切换 - **安全可信**:内置数据加密、审计、权限管控等安全特性 - **生态兼容**:兼容PostgreSQL/MySQL协议,迁移成本低 ### 1.3 设计原则 - **标准化**:遵循OpenGauss数据库设计规范 - **多租户**:基于tenant_id字段实现数据隔离 - **可扩展**:预留扩展字段,支持业务增长 - **高性能**:合理设计索引,优化查询性能 - **安全性**:利用OpenGauss内置安全特性 ## 二、数据库架构 ### 1. 数据库架构图 ![流程图 1](temp_mermaid_86176/diagram_1.png)\n ### 2. 多租户架构设计 ![流程图 2](temp_mermaid_86176/diagram_2.png)\n ### 3. 通用字段设计 所有业务表统一包含以下基础字段: | 字段名 | 数据类型 | 长度 | 默认值 | 描述 | |-------|---------|------|--------|-----| | id | BIGINT | - | AUTO_INCREMENT | 主键ID | | tenant_id | BIGINT | - | 0 | 租户ID(多租户隔离) | | creator | VARCHAR | 64 | '' | 创建者 | | create_time | DATETIME | - | CURRENT_TIMESTAMP | 创建时间 | | updater | VARCHAR | 64 | '' | 更新者 | | update_time | DATETIME | - | CURRENT_TIMESTAMP | 更新时间 | | deleted | BIT | 1 | 0 | 逻辑删除标识 | ## 三、核心数据模型ER图 ### 1. 客户管理模块ER图 ![流程图 3](temp_mermaid_86176/diagram_3.png)\n ### 2. 营收管理模块ER图 ![流程图 4](temp_mermaid_86176/diagram_4.png)\n ### 3. 表务管理模块ER图 ![流程图 5](temp_mermaid_86176/diagram_5.png)\n ### 4. 系统管理模块ER图 ![流程图 6](temp_mermaid_86176/diagram_6.png)\n ## 四、核心数据表设计 ### 1. 表务管理模块ER图 ![流程图 7](temp_mermaid_86176/diagram_7.png)\n ### 2. 系统管理模块ER图 ![流程图 8](temp_mermaid_86176/diagram_8.png)\n ## 五、完整DDL语句 ### 1. 客户管理相关表DDL #### 1.1 客户基本信息表 ```sql CREATE TABLE `water_customer` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', `customer_code` varchar(32) NOT NULL COMMENT '客户编号', `customer_name` varchar(100) NOT NULL COMMENT '客户名称', `customer_type` varchar(20) NOT NULL COMMENT '客户类型(居民:RESIDENT,非居民:NON_RESIDENT,工业:INDUSTRIAL,行政:ADMINISTRATIVE)', `id_type` varchar(20) DEFAULT NULL COMMENT '证件类型(身份证:ID_CARD,营业执照:BUSINESS_LICENSE)', `id_number` varchar(30) DEFAULT NULL COMMENT '证件号码', `phone` varchar(20) DEFAULT NULL COMMENT '联系电话', `mobile` varchar(20) DEFAULT NULL COMMENT '手机号码', `email` varchar(100) DEFAULT NULL COMMENT '邮箱', `address` varchar(500) DEFAULT NULL COMMENT '详细地址', `area_code` varchar(20) DEFAULT NULL COMMENT '行政区划代码', `postal_code` varchar(10) DEFAULT NULL COMMENT '邮政编码', `contact_person` varchar(50) DEFAULT NULL COMMENT '联系人', `bank_account` varchar(50) DEFAULT NULL COMMENT '银行账户', `bank_name` varchar(100) DEFAULT NULL COMMENT '开户银行', `remark` varchar(500) DEFAULT NULL COMMENT '备注信息', `status` tinyint NOT NULL DEFAULT '1' COMMENT '状态(0:停用,1:正常,2:欠费,3:销户)', `tenant_id` bigint NOT NULL DEFAULT '0' COMMENT '租户ID', `creator` varchar(64) DEFAULT '' COMMENT '创建者', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `updater` varchar(64) DEFAULT '' COMMENT '更新者', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', PRIMARY KEY (`id`), UNIQUE KEY `uk_customer_code` (`customer_code`, `tenant_id`), KEY `idx_customer_name` (`customer_name`), KEY `idx_phone` (`phone`), KEY `idx_id_number` (`id_number`), KEY `idx_tenant_customer_type` (`tenant_id`, `customer_type`), KEY `idx_status` (`status`), KEY `idx_create_time` (`create_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='客户基本信息表'; ``` #### 1.2 水表信息表 ```sql CREATE TABLE `water_meter` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', `meter_code` varchar(32) NOT NULL COMMENT '水表编号', `meter_no` varchar(30) DEFAULT NULL COMMENT '水表表号', `meter_type` varchar(20) NOT NULL COMMENT '水表类型(机械:MECHANICAL,智能:SMART,远传:REMOTE)', `meter_model` varchar(50) DEFAULT NULL COMMENT '水表型号', `meter_caliber` varchar(10) DEFAULT NULL COMMENT '水表口径(15mm,20mm,25mm等)', `manufacturer` varchar(100) DEFAULT NULL COMMENT '生产厂家', `production_date` date DEFAULT NULL COMMENT '生产日期', `install_date` date DEFAULT NULL COMMENT '安装日期', `install_position` varchar(500) DEFAULT NULL COMMENT '安装位置', `longitude` decimal(10,7) DEFAULT NULL COMMENT '经度', `latitude` decimal(10,7) DEFAULT NULL COMMENT '纬度', `initial_reading` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '初始读数', `current_reading` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '当前读数', `reading_cycle` varchar(20) NOT NULL DEFAULT 'MONTHLY' COMMENT '抄表周期(月度:MONTHLY,双月:BIMONTHLY,季度:QUARTERLY)', `book_code` varchar(32) DEFAULT NULL COMMENT '册本编号', `reading_route` varchar(100) DEFAULT NULL COMMENT '抄表路线', `meter_status` tinyint NOT NULL DEFAULT '1' COMMENT '水表状态(0:停用,1:正常,2:故障,3:拆除)', `customer_id` bigint NOT NULL COMMENT '客户ID', `tenant_id` bigint NOT NULL DEFAULT '0' COMMENT '租户ID', `creator` varchar(64) DEFAULT '' COMMENT '创建者', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `updater` varchar(64) DEFAULT '' COMMENT '更新者', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', PRIMARY KEY (`id`), UNIQUE KEY `uk_meter_code` (`meter_code`, `tenant_id`), KEY `idx_meter_no` (`meter_no`), KEY `idx_customer_id` (`customer_id`), KEY `idx_book_code` (`book_code`), KEY `idx_meter_type` (`meter_type`), KEY `idx_meter_status` (`meter_status`), KEY `idx_tenant_status` (`tenant_id`, `meter_status`), CONSTRAINT `fk_meter_customer` FOREIGN KEY (`customer_id`) REFERENCES `water_customer` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='水表信息表'; ``` ### 3. 表务工单管理表DDL #### 3.1 表务工单表 ```sql CREATE TABLE `water_meter_workorder` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', `workorder_code` varchar(32) NOT NULL COMMENT '工单编号', `workorder_type` varchar(20) NOT NULL COMMENT '工单类型(换表:CHANGE,移表:MOVE,拆表:REMOVE,装表:INSTALL,维修:REPAIR)', `workorder_status` varchar(20) NOT NULL DEFAULT 'PENDING' COMMENT '工单状态(待处理:PENDING,执行中:PROCESSING,已完成:COMPLETED,已取消:CANCELLED)', `apply_date` date NOT NULL COMMENT '申请日期', `plan_date` date DEFAULT NULL COMMENT '计划执行日期', `execute_date` date DEFAULT NULL COMMENT '实际执行日期', `applicant_id` varchar(20) DEFAULT NULL COMMENT '申请人ID', `applicant_name` varchar(50) DEFAULT NULL COMMENT '申请人姓名', `executor_id` varchar(20) DEFAULT NULL COMMENT '执行人ID', `executor_name` varchar(50) DEFAULT NULL COMMENT '执行人姓名', `reason` varchar(500) DEFAULT NULL COMMENT '申请原因', `result` varchar(500) DEFAULT NULL COMMENT '执行结果', `old_meter_no` varchar(30) DEFAULT NULL COMMENT '旧水表表号', `new_meter_no` varchar(30) DEFAULT NULL COMMENT '新水表表号', `old_reading` decimal(10,2) DEFAULT NULL COMMENT '旧表读数', `new_reading` decimal(10,2) DEFAULT NULL COMMENT '新表读数', `cost_amount` decimal(10,2) DEFAULT NULL COMMENT '费用金额', `remark` varchar(500) DEFAULT NULL COMMENT '备注', `meter_id` bigint NOT NULL COMMENT '水表ID', `customer_id` bigint NOT NULL COMMENT '客户ID', `tenant_id` bigint NOT NULL DEFAULT '0' COMMENT '租户ID', `creator` varchar(64) DEFAULT '' COMMENT '创建者', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `updater` varchar(64) DEFAULT '' COMMENT '更新者', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', PRIMARY KEY (`id`), UNIQUE KEY `uk_workorder_code` (`workorder_code`, `tenant_id`), KEY `idx_workorder_type` (`workorder_type`), KEY `idx_workorder_status` (`workorder_status`), KEY `idx_apply_date` (`apply_date`), KEY `idx_meter_id` (`meter_id`), KEY `idx_customer_id` (`customer_id`), KEY `idx_tenant_type_status` (`tenant_id`, `workorder_type`, `workorder_status`), CONSTRAINT `fk_workorder_meter` FOREIGN KEY (`meter_id`) REFERENCES `water_meter` (`id`), CONSTRAINT `fk_workorder_customer` FOREIGN KEY (`customer_id`) REFERENCES `water_customer` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='表务工单表'; ``` #### 3.2 水表库存管理表 ```sql CREATE TABLE `water_meter_stock` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', `stock_code` varchar(32) NOT NULL COMMENT '库存编号', `meter_brand` varchar(50) NOT NULL COMMENT '水表品牌', `meter_model` varchar(50) NOT NULL COMMENT '水表型号', `meter_caliber` varchar(10) NOT NULL COMMENT '水表口径', `meter_type` varchar(20) NOT NULL COMMENT '水表类型', `stock_quantity` int NOT NULL DEFAULT '0' COMMENT '库存数量', `min_stock` int NOT NULL DEFAULT '0' COMMENT '最小库存', `max_stock` int DEFAULT NULL COMMENT '最大库存', `unit_price` decimal(10,2) DEFAULT NULL COMMENT '单价', `warehouse_location` varchar(100) DEFAULT NULL COMMENT '仓库位置', `supplier` varchar(100) DEFAULT NULL COMMENT '供应商', `purchase_date` date DEFAULT NULL COMMENT '进货日期', `warranty_period` int DEFAULT '24' COMMENT '质保期(月)', `stock_status` tinyint NOT NULL DEFAULT '1' COMMENT '库存状态(0:停用,1:正常,2:缺货,3:超储)', `remark` varchar(500) DEFAULT NULL COMMENT '备注', `tenant_id` bigint NOT NULL DEFAULT '0' COMMENT '租户ID', `creator` varchar(64) DEFAULT '' COMMENT '创建者', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `updater` varchar(64) DEFAULT '' COMMENT '更新者', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', PRIMARY KEY (`id`), UNIQUE KEY `uk_stock_code` (`stock_code`, `tenant_id`), KEY `idx_meter_brand` (`meter_brand`), KEY `idx_meter_model` (`meter_model`), KEY `idx_meter_caliber` (`meter_caliber`), KEY `idx_stock_status` (`stock_status`), KEY `idx_tenant_brand_model` (`tenant_id`, `meter_brand`, `meter_model`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='水表库存管理表'; ``` ### 4. 系统管理相关表DDL #### 4.1 数据字典类型表 ```sql CREATE TABLE `water_dict_type` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', `dict_name` varchar(100) NOT NULL COMMENT '字典名称', `dict_type` varchar(100) NOT NULL COMMENT '字典类型', `remark` varchar(500) DEFAULT NULL COMMENT '备注', `status` tinyint NOT NULL DEFAULT '1' COMMENT '状态(0:停用,1:正常)', `tenant_id` bigint NOT NULL DEFAULT '0' COMMENT '租户ID', `creator` varchar(64) DEFAULT '' COMMENT '创建者', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `updater` varchar(64) DEFAULT '' COMMENT '更新者', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', PRIMARY KEY (`id`), UNIQUE KEY `uk_dict_type` (`dict_type`, `tenant_id`), KEY `idx_status` (`status`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='数据字典类型表'; ``` ### 5. 完整DDL语句列表 #### 5.1 客户基本信息表 (OpenGauss版本) ```sql -- OpenGauss数据库DDL语句 CREATE TABLE water_customer ( id SERIAL PRIMARY KEY, customer_code VARCHAR(32) NOT NULL, customer_name VARCHAR(100) NOT NULL, customer_type VARCHAR(20) NOT NULL CHECK (customer_type IN ('RESIDENT','NON_RESIDENT','INDUSTRIAL','ADMINISTRATIVE')), id_type VARCHAR(20) DEFAULT NULL CHECK (id_type IN ('ID_CARD','BUSINESS_LICENSE') OR id_type IS NULL), id_number VARCHAR(30) DEFAULT NULL, phone VARCHAR(20) DEFAULT NULL, mobile VARCHAR(20) DEFAULT NULL, email VARCHAR(100) DEFAULT NULL, address VARCHAR(500) DEFAULT NULL, area_code VARCHAR(20) DEFAULT NULL, postal_code VARCHAR(10) DEFAULT NULL, contact_person VARCHAR(50) DEFAULT NULL, bank_account VARCHAR(50) DEFAULT NULL, bank_name VARCHAR(100) DEFAULT NULL, remark VARCHAR(500) DEFAULT NULL, status SMALLINT NOT NULL DEFAULT 1 CHECK (status IN (0,1,2,3)), tenant_id BIGINT NOT NULL DEFAULT 0, creator VARCHAR(64) DEFAULT '', create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, updater VARCHAR(64) DEFAULT '', update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, deleted BOOLEAN NOT NULL DEFAULT FALSE ); -- 创建注释 COMMENT ON TABLE water_customer IS '客户基本信息表'; COMMENT ON COLUMN water_customer.id IS '主键ID'; COMMENT ON COLUMN water_customer.customer_code IS '客户编号'; COMMENT ON COLUMN water_customer.customer_name IS '客户名称'; COMMENT ON COLUMN water_customer.customer_type IS '客户类型(居民:RESIDENT,非居民:NON_RESIDENT,工业:INDUSTRIAL,行政:ADMINISTRATIVE)'; COMMENT ON COLUMN water_customer.id_type IS '证件类型(身份证:ID_CARD,营业执照:BUSINESS_LICENSE)'; COMMENT ON COLUMN water_customer.id_number IS '证件号码'; COMMENT ON COLUMN water_customer.phone IS '联系电话'; COMMENT ON COLUMN water_customer.mobile IS '手机号码'; COMMENT ON COLUMN water_customer.email IS '邮箱'; COMMENT ON COLUMN water_customer.address IS '详细地址'; COMMENT ON COLUMN water_customer.area_code IS '行政区划代码'; COMMENT ON COLUMN water_customer.postal_code IS '邮政编码'; COMMENT ON COLUMN water_customer.contact_person IS '联系人'; COMMENT ON COLUMN water_customer.bank_account IS '银行账户'; COMMENT ON COLUMN water_customer.bank_name IS '开户银行'; COMMENT ON COLUMN water_customer.remark IS '备注信息'; COMMENT ON COLUMN water_customer.status IS '状态(0:停用,1:正常,2:欠费,3:销户)'; COMMENT ON COLUMN water_customer.tenant_id IS '租户ID'; COMMENT ON COLUMN water_customer.creator IS '创建者'; COMMENT ON COLUMN water_customer.create_time IS '创建时间'; COMMENT ON COLUMN water_customer.updater IS '更新者'; COMMENT ON COLUMN water_customer.update_time IS '更新时间'; COMMENT ON COLUMN water_customer.deleted IS '是否删除'; -- 创建索引 CREATE UNIQUE INDEX uk_customer_code ON water_customer (customer_code, tenant_id); CREATE INDEX idx_customer_name ON water_customer (customer_name); CREATE INDEX idx_phone ON water_customer (phone); CREATE INDEX idx_id_number ON water_customer (id_number); CREATE INDEX idx_tenant_customer_type ON water_customer (tenant_id, customer_type); CREATE INDEX idx_status ON water_customer (status); CREATE INDEX idx_create_time ON water_customer (create_time); -- 创建更新时间触发器 CREATE OR REPLACE FUNCTION update_timestamp() RETURNS TRIGGER AS $$ BEGIN NEW.update_time = CURRENT_TIMESTAMP; RETURN NEW; END; $$ LANGUAGE plpgsql; CREATE TRIGGER water_customer_update_timestamp BEFORE UPDATE ON water_customer FOR EACH ROW EXECUTE FUNCTION update_timestamp(); ``` #### 1.2 水表信息表 ```sql CREATE TABLE `water_meter` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', `meter_code` varchar(32) NOT NULL COMMENT '水表编号', `meter_no` varchar(30) DEFAULT NULL COMMENT '水表表号', `meter_type` varchar(20) NOT NULL COMMENT '水表类型(机械:MECHANICAL,智能:SMART,远传:REMOTE)', `meter_model` varchar(50) DEFAULT NULL COMMENT '水表型号', `meter_caliber` varchar(10) DEFAULT NULL COMMENT '水表口径(15mm,20mm,25mm等)', `manufacturer` varchar(100) DEFAULT NULL COMMENT '生产厂家', `production_date` date DEFAULT NULL COMMENT '生产日期', `install_date` date DEFAULT NULL COMMENT '安装日期', `install_position` varchar(500) DEFAULT NULL COMMENT '安装位置', `longitude` decimal(10,7) DEFAULT NULL COMMENT '经度', `latitude` decimal(10,7) DEFAULT NULL COMMENT '纬度', `initial_reading` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '初始读数', `current_reading` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '当前读数', `reading_cycle` varchar(20) NOT NULL DEFAULT 'MONTHLY' COMMENT '抄表周期(月度:MONTHLY,双月:BIMONTHLY,季度:QUARTERLY)', `book_code` varchar(32) DEFAULT NULL COMMENT '册本编号', `reading_route` varchar(100) DEFAULT NULL COMMENT '抄表路线', `meter_status` tinyint NOT NULL DEFAULT '1' COMMENT '水表状态(0:停用,1:正常,2:故障,3:拆除)', `customer_id` bigint NOT NULL COMMENT '客户ID', `tenant_id` bigint NOT NULL DEFAULT '0' COMMENT '租户ID', `creator` varchar(64) DEFAULT '' COMMENT '创建者', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `updater` varchar(64) DEFAULT '' COMMENT '更新者', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', PRIMARY KEY (`id`), UNIQUE KEY `uk_meter_code` (`meter_code`, `tenant_id`), KEY `idx_meter_no` (`meter_no`), KEY `idx_customer_id` (`customer_id`), KEY `idx_book_code` (`book_code`), KEY `idx_meter_type` (`meter_type`), KEY `idx_meter_status` (`meter_status`), KEY `idx_tenant_status` (`tenant_id`, `meter_status`), CONSTRAINT `fk_meter_customer` FOREIGN KEY (`customer_id`) REFERENCES `water_customer` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='水表信息表'; ``` #### 1.3 客户账户表 ```sql CREATE TABLE `water_customer_account` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', `account_code` varchar(32) NOT NULL COMMENT '账户编号', `balance` decimal(12,2) NOT NULL DEFAULT '0.00' COMMENT '账户余额', `credit_amount` decimal(12,2) DEFAULT '0.00' COMMENT '信用额度', `deposit_amount` decimal(12,2) DEFAULT '0.00' COMMENT '保证金', `frozen_amount` decimal(12,2) DEFAULT '0.00' COMMENT '冻结金额', `last_payment_date` date DEFAULT NULL COMMENT '最近缴费日期', `last_payment_amount` decimal(12,2) DEFAULT NULL COMMENT '最近缴费金额', `arrears_amount` decimal(12,2) DEFAULT '0.00' COMMENT '欠费金额', `arrears_months` int DEFAULT '0' COMMENT '欠费月数', `account_status` tinyint NOT NULL DEFAULT '1' COMMENT '账户状态(0:停用,1:正常,2:欠费,3:冻结)', `customer_id` bigint NOT NULL COMMENT '客户ID', `tenant_id` bigint NOT NULL DEFAULT '0' COMMENT '租户ID', `creator` varchar(64) DEFAULT '' COMMENT '创建者', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `updater` varchar(64) DEFAULT '' COMMENT '更新者', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', PRIMARY KEY (`id`), UNIQUE KEY `uk_account_code` (`account_code`, `tenant_id`), UNIQUE KEY `uk_customer_account` (`customer_id`, `tenant_id`), KEY `idx_account_status` (`account_status`), KEY `idx_balance` (`balance`), KEY `idx_arrears` (`arrears_amount`), CONSTRAINT `fk_account_customer` FOREIGN KEY (`customer_id`) REFERENCES `water_customer` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='客户账户信息表'; ``` ### 2. 营收管理相关表DDL #### 2.1 抄表记录表 ```sql CREATE TABLE `water_meter_reading` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', `reading_code` varchar(32) NOT NULL COMMENT '抄表记录编号', `reading_date` date NOT NULL COMMENT '抄表日期', `reading_time` datetime DEFAULT NULL COMMENT '抄表时间', `reading_value` decimal(10,2) NOT NULL COMMENT '抄表读数', `prev_reading_value` decimal(10,2) DEFAULT NULL COMMENT '上次读数', `water_usage` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '用水量', `reading_type` varchar(20) NOT NULL COMMENT '抄表类型(手工:MANUAL,远传:REMOTE,自报:SELF_REPORT,估算:ESTIMATE)', `reading_method` varchar(20) DEFAULT NULL COMMENT '抄表方式(现场:FIELD,拍照:PHOTO,NFC:NFC,扫码:SCAN)', `reader_id` varchar(20) DEFAULT NULL COMMENT '抄表员ID', `reader_name` varchar(50) DEFAULT NULL COMMENT '抄表员姓名', `photo_url` varchar(255) DEFAULT NULL COMMENT '抄表照片URL', `reading_location` varchar(200) DEFAULT NULL COMMENT '抄表位置', `abnormal_flag` tinyint DEFAULT '0' COMMENT '异常标识(0:正常,1:异常)', `abnormal_reason` varchar(200) DEFAULT NULL COMMENT '异常原因', `remark` varchar(500) DEFAULT NULL COMMENT '备注', `reading_status` tinyint NOT NULL DEFAULT '0' COMMENT '状态(0:未复核,1:已复核,2:已开账,3:作废)', `meter_id` bigint NOT NULL COMMENT '水表ID', `customer_id` bigint NOT NULL COMMENT '客户ID', `tenant_id` bigint NOT NULL DEFAULT '0' COMMENT '租户ID', `creator` varchar(64) DEFAULT '' COMMENT '创建者', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `updater` varchar(64) DEFAULT '' COMMENT '更新者', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', PRIMARY KEY (`id`), UNIQUE KEY `uk_reading_code` (`reading_code`, `tenant_id`), KEY `idx_meter_reading_date` (`meter_id`, `reading_date`), KEY `idx_reading_date` (`reading_date`), KEY `idx_reader_id` (`reader_id`), KEY `idx_reading_status` (`reading_status`), KEY `idx_customer_id` (`customer_id`), KEY `idx_tenant_meter_date` (`tenant_id`, `meter_id`, `reading_date`), CONSTRAINT `fk_reading_meter` FOREIGN KEY (`meter_id`) REFERENCES `water_meter` (`id`), CONSTRAINT `fk_reading_customer` FOREIGN KEY (`customer_id`) REFERENCES `water_customer` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='抄表记录表'; ``` #### 2.2 水费账单表 ```sql CREATE TABLE `water_bill` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', `bill_code` varchar(32) NOT NULL COMMENT '账单编号', `bill_month` varchar(7) NOT NULL COMMENT '账期(格式:YYYY-MM)', `bill_date` date NOT NULL COMMENT '开账日期', `water_usage` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '用水量', `prev_reading` decimal(10,2) DEFAULT NULL COMMENT '上期读数', `current_reading` decimal(10,2) DEFAULT NULL COMMENT '本期读数', `reading_days` int DEFAULT NULL COMMENT '抄表间隔天数', `water_price` decimal(8,4) DEFAULT NULL COMMENT '水价单价', `water_fee` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '水费金额', `sewage_fee` decimal(10,2) DEFAULT '0.00' COMMENT '污水处理费', `garbage_fee` decimal(10,2) DEFAULT '0.00' COMMENT '垃圾处理费', `other_fee` decimal(10,2) DEFAULT '0.00' COMMENT '其他费用', `adjustment_fee` decimal(10,2) DEFAULT '0.00' COMMENT '调整费用', `late_fee` decimal(10,2) DEFAULT '0.00' COMMENT '滞纳金', `total_amount` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '总金额', `paid_amount` decimal(10,2) DEFAULT '0.00' COMMENT '已缴金额', `balance_amount` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '余额', `due_date` date NOT NULL COMMENT '缴费截止日期', `billing_type` varchar(20) DEFAULT 'NORMAL' COMMENT '开账类型(正常:NORMAL,追补:SUPPLEMENT,调整:ADJUSTMENT)', `bill_status` tinyint NOT NULL DEFAULT '0' COMMENT '账单状态(0:未缴费,1:已缴费,2:部分缴费,3:作废)', `payment_status` tinyint DEFAULT '0' COMMENT '缴费状态(0:未缴,1:已缴,2:部分缴费)', `customer_id` bigint NOT NULL COMMENT '客户ID', `meter_id` bigint NOT NULL COMMENT '水表ID', `reading_id` bigint DEFAULT NULL COMMENT '抄表记录ID', `tenant_id` bigint NOT NULL DEFAULT '0' COMMENT '租户ID', `creator` varchar(64) DEFAULT '' COMMENT '创建者', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `updater` varchar(64) DEFAULT '' COMMENT '更新者', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', PRIMARY KEY (`id`), UNIQUE KEY `uk_bill_code` (`bill_code`, `tenant_id`), KEY `idx_customer_bill_month` (`customer_id`, `bill_month`), KEY `idx_meter_bill_month` (`meter_id`, `bill_month`), KEY `idx_bill_status` (`bill_status`), KEY `idx_due_date` (`due_date`), KEY `idx_tenant_customer_month` (`tenant_id`, `customer_id`, `bill_month`), CONSTRAINT `fk_bill_customer` FOREIGN KEY (`customer_id`) REFERENCES `water_customer` (`id`), CONSTRAINT `fk_bill_meter` FOREIGN KEY (`meter_id`) REFERENCES `water_meter` (`id`), CONSTRAINT `fk_bill_reading` FOREIGN KEY (`reading_id`) REFERENCES `water_meter_reading` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='水费账单表'; ``` #### 2.3 缴费记录表 ```sql CREATE TABLE `water_payment` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', `payment_code` varchar(32) NOT NULL COMMENT '缴费记录编号', `payment_type` varchar(20) NOT NULL COMMENT '缴费类型(正常缴费:NORMAL,预存:PREPAID,退费:REFUND)', `payment_channel` varchar(20) NOT NULL COMMENT '缴费渠道(现金:CASH,银行卡:BANK_CARD,微信:WECHAT,支付宝:ALIPAY,银行代扣:BANK_DEDUCT)', `payment_amount` decimal(10,2) NOT NULL COMMENT '缴费金额', `actual_amount` decimal(10,2) DEFAULT NULL COMMENT '实收金额', `change_amount` decimal(10,2) DEFAULT '0.00' COMMENT '找零金额', `payment_time` datetime NOT NULL COMMENT '缴费时间', `transaction_no` varchar(50) DEFAULT NULL COMMENT '交易流水号', `third_party_no` varchar(50) DEFAULT NULL COMMENT '第三方交易号', `operator_id` varchar(20) DEFAULT NULL COMMENT '操作员ID', `operator_name` varchar(50) DEFAULT NULL COMMENT '操作员姓名', `outlet_code` varchar(20) DEFAULT NULL COMMENT '营业网点代码', `pos_machine_no` varchar(20) DEFAULT NULL COMMENT 'POS机编号', `invoice_no` varchar(30) DEFAULT NULL COMMENT '发票号码', `remark` varchar(500) DEFAULT NULL COMMENT '备注', `payment_status` tinyint NOT NULL DEFAULT '1' COMMENT '缴费状态(0:待确认,1:成功,2:失败,3:退费)', `bill_id` bigint DEFAULT NULL COMMENT '账单ID', `customer_id` bigint NOT NULL COMMENT '客户ID', `tenant_id` bigint NOT NULL DEFAULT '0' COMMENT '租户ID', `creator` varchar(64) DEFAULT '' COMMENT '创建者', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `updater` varchar(64) DEFAULT '' COMMENT '更新者', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', PRIMARY KEY (`id`), UNIQUE KEY `uk_payment_code` (`payment_code`, `tenant_id`), KEY `idx_customer_payment_time` (`customer_id`, `payment_time`), KEY `idx_payment_time` (`payment_time`), KEY `idx_transaction_no` (`transaction_no`), KEY `idx_operator_id` (`operator_id`), KEY `idx_payment_status` (`payment_status`), KEY `idx_bill_id` (`bill_id`), CONSTRAINT `fk_payment_customer` FOREIGN KEY (`customer_id`) REFERENCES `water_customer` (`id`), CONSTRAINT `fk_payment_bill` FOREIGN KEY (`bill_id`) REFERENCES `water_bill` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='缴费记录表'; ``` ### 3. 表务管理相关表DDL #### 3.1 水表档案表 ```sql CREATE TABLE `water_meter_archive` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', `archive_code` varchar(32) NOT NULL COMMENT '档案编号', `manufacturer` varchar(100) DEFAULT NULL COMMENT '生产厂家', `production_date` date DEFAULT NULL COMMENT '生产日期', `valid_period` int DEFAULT '72' COMMENT '有效期(月)', `verification_date` date DEFAULT NULL COMMENT '检定日期', `next_verification_date` date DEFAULT NULL COMMENT '下次检定日期', `certificate_no` varchar(50) DEFAULT NULL COMMENT '检定证书号', `verification_agency` varchar(100) DEFAULT NULL COMMENT '检定机构', `accuracy_level` varchar(10) DEFAULT NULL COMMENT '精度等级', `max_flow` decimal(8,2) DEFAULT NULL COMMENT '最大流量', `nominal_flow` decimal(8,2) DEFAULT NULL COMMENT '常用流量', `min_flow` decimal(8,2) DEFAULT NULL COMMENT '最小流量', `working_pressure` decimal(8,2) DEFAULT NULL COMMENT '工作压力', `purchase_date` date DEFAULT NULL COMMENT '采购日期', `purchase_price` decimal(10,2) DEFAULT NULL COMMENT '采购价格', `supplier` varchar(100) DEFAULT NULL COMMENT '供应商', `warranty_period` int DEFAULT '24' COMMENT '质保期(月)', `installation_cost` decimal(10,2) DEFAULT NULL COMMENT '安装费用', `archive_status` tinyint NOT NULL DEFAULT '1' COMMENT '档案状态(0:停用,1:正常,2:报废)', `meter_id` bigint NOT NULL COMMENT '水表ID', `tenant_id` bigint NOT NULL DEFAULT '0' COMMENT '租户ID', `creator` varchar(64) DEFAULT '' COMMENT '创建者', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `updater` varchar(64) DEFAULT '' COMMENT '更新者', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', PRIMARY KEY (`id`), UNIQUE KEY `uk_archive_code` (`archive_code`, `tenant_id`), UNIQUE KEY `uk_meter_archive` (`meter_id`, `tenant_id`), KEY `idx_manufacturer` (`manufacturer`), KEY `idx_verification_date` (`verification_date`), KEY `idx_next_verification_date` (`next_verification_date`), KEY `idx_archive_status` (`archive_status`), CONSTRAINT `fk_archive_meter` FOREIGN KEY (`meter_id`) REFERENCES `water_meter` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='水表档案表'; ``` ### 4. 系统管理相关表DDL #### 4.1 数据字典表 ```sql CREATE TABLE `water_dict_data` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', `dict_type` varchar(100) NOT NULL COMMENT '字典类型', `dict_label` varchar(100) NOT NULL COMMENT '字典标签', `dict_value` varchar(100) NOT NULL COMMENT '字典键值', `dict_sort` int NOT NULL DEFAULT '0' COMMENT '字典排序', `color_type` varchar(100) DEFAULT '' COMMENT '颜色类型', `css_class` varchar(100) DEFAULT '' COMMENT 'CSS类名', `remark` varchar(500) DEFAULT NULL COMMENT '备注', `status` tinyint NOT NULL DEFAULT '1' COMMENT '状态(0:停用,1:正常)', `tenant_id` bigint NOT NULL DEFAULT '0' COMMENT '租户ID', `creator` varchar(64) DEFAULT '' COMMENT '创建者', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `updater` varchar(64) DEFAULT '' COMMENT '更新者', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', PRIMARY KEY (`id`), KEY `idx_dict_type` (`dict_type`), KEY `idx_dict_value` (`dict_value`), KEY `idx_status` (`status`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='数据字典表'; ``` ### 5. 初始化数据脚本 ```sql -- 插入基础字典数据 INSERT INTO `water_dict_data` (`dict_type`, `dict_label`, `dict_value`, `dict_sort`, `status`, `remark`) VALUES ('customer_type', '居民用户', 'RESIDENT', 1, 1, '居民生活用水'), ('customer_type', '非居民用户', 'NON_RESIDENT', 2, 1, '非居民用水'), ('customer_type', '工业用户', 'INDUSTRIAL', 3, 1, '工业生产用水'), ('customer_type', '行政用户', 'ADMINISTRATIVE', 4, 1, '行政事业单位用水'), ('meter_type', '机械水表', 'MECHANICAL', 1, 1, '传统机械式水表'), ('meter_type', '智能水表', 'SMART', 2, 1, '智能电子水表'), ('meter_type', '远传水表', 'REMOTE', 3, 1, '远程传输水表'), ('reading_type', '人工抄表', 'MANUAL', 1, 1, '抄表员现场抄表'), ('reading_type', '远程抄表', 'REMOTE', 2, 1, '远程自动抄表'), ('reading_type', '客户自报', 'SELF_REPORT', 3, 1, '客户自主上报'), ('reading_type', '估算抄表', 'ESTIMATE', 4, 1, '估算用水量'), ('payment_channel', '现金', 'CASH', 1, 1, '现金缴费'), ('payment_channel', '银行卡', 'BANK_CARD', 2, 1, '银行卡刷卡'), ('payment_channel', '微信支付', 'WECHAT', 3, 1, '微信在线支付'), ('payment_channel', '支付宝', 'ALIPAY', 4, 1, '支付宝在线支付'), ('payment_channel', '银行代扣', 'BANK_DEDUCT', 5, 1, '银行自动代扣'); ``` ## 六、OpenGauss数据库特性应用 ### 1. OpenGauss高级特性 #### 1.1 分区表设计 ```sql -- 按月份分区的账单表 CREATE TABLE water_bill ( -- 字段定义... ) PARTITION BY RANGE (bill_month) ( PARTITION p202401 VALUES LESS THAN ('2024-02'), PARTITION p202402 VALUES LESS THAN ('2024-03'), PARTITION p202403 VALUES LESS THAN ('2024-04') -- 继续按月创建分区... ); ``` #### 1.2 列存储表 ```sql -- 统计分析用的列存储表 CREATE TABLE water_bill_stats ( -- 字段定义... ) WITH (ORIENTATION = COLUMN); ``` #### 1.3 内存表 ```sql -- 配置参数缓存表 CREATE TABLE water_config_cache ( -- 字段定义... ) WITH (ORIENTATION = ROW, STORAGE_TYPE = USTORE); ``` ### 2. 性能优化配置 #### 2.1 连接池配置 ```sql -- OpenGauss连接池参数 ALTER SYSTEM SET max_connections = 200; ALTER SYSTEM SET shared_buffers = '256MB'; ALTER SYSTEM SET effective_cache_size = '1GB'; ALTER SYSTEM SET work_mem = '4MB'; ``` #### 2.2 并行查询 ```sql -- 启用并行查询 ALTER SYSTEM SET max_parallel_workers = 8; ALTER SYSTEM SET max_parallel_workers_per_gather = 4; ``` ## 七、索引设计与优化 ### 1. 基础索引设计 #### 1.1 主键索引 - 所有表使用SERIAL主键,自动创建B树索引 - 支持OpenGauss的快速主键查询优化 #### 1.2 唯一索引 ```sql -- 客户编号唯一索引 CREATE UNIQUE INDEX uk_customer_code ON water_customer (customer_code, tenant_id); -- 水表编号唯一索引 CREATE UNIQUE INDEX uk_meter_code ON water_meter (meter_code, tenant_id); ``` #### 1.3 复合索引 ```sql -- 多租户查询优化 CREATE INDEX idx_tenant_customer_type ON water_customer (tenant_id, customer_type); -- 账单查询优化 CREATE INDEX idx_tenant_customer_month ON water_bill (tenant_id, customer_id, bill_month); -- 抄表查询优化 CREATE INDEX idx_tenant_meter_date ON water_meter_reading (tenant_id, meter_id, reading_date); ``` ### 2. OpenGauss特殊索引 #### 2.1 HASH索引 ```sql -- 等值查询优化 CREATE INDEX CONCURRENTLY idx_customer_phone_hash ON water_customer USING HASH (phone); ``` #### 2.2 GIN索引 ```sql -- 全文检索索引 CREATE INDEX idx_customer_name_gin ON water_customer USING GIN (to_tsvector('simple', customer_name)); ``` #### 2.3 部分索引 ```sql -- 只对有效数据建索引 CREATE INDEX idx_active_customers ON water_customer (customer_code) WHERE deleted = FALSE AND status = 1; ``` ## 八、OpenGauss数据安全设计 ### 1. 内置安全特性 #### 1.1 透明数据加密 (TDE) ```sql -- 启用表级加密 CREATE TABLE water_customer_encrypted ( -- 字段定义... ) WITH (ENCRYPTION_TYPE = 'AES_128_CTR'); -- 敏感字段加密 ALTER TABLE water_customer ADD COLUMN id_number_encrypted BYTEA GENERATED ALWAYS AS (gs_encrypt_aes128(id_number, '密钥')) STORED; ``` #### 1.2 行级安全策略 (RLS) ```sql -- 创建多租户行级安全 ALTER TABLE water_customer ENABLE ROW LEVEL SECURITY; -- 创建策略 CREATE POLICY tenant_isolation_policy ON water_customer FOR ALL TO PUBLIC USING (tenant_id = current_setting('app.current_tenant_id')::bigint); ``` #### 1.3 动态数据脱敏 ```sql -- 创建脱敏函数 CREATE OR REPLACE FUNCTION mask_phone(phone_no TEXT) RETURNS TEXT AS $$ BEGIN RETURN SUBSTRING(phone_no, 1, 3) || '****' || SUBSTRING(phone_no, 8); END; $$ LANGUAGE plpgsql; -- 创建脱敏视图 CREATE VIEW water_customer_masked AS SELECT id, customer_code, customer_name, mask_phone(phone) as phone_masked, -- 其他字段... FROM water_customer; ``` ### 2. 权限控制体系 #### 2.1 角色权限设计 ```sql -- 创建业务角色 CREATE ROLE water_admin; CREATE ROLE water_operator; CREATE ROLE water_viewer; -- 分配权限 GRANT ALL ON water_customer TO water_admin; GRANT SELECT, INSERT, UPDATE ON water_customer TO water_operator; GRANT SELECT ON water_customer_masked TO water_viewer; ``` #### 2.2 列级权限控制 ```sql -- 敏感字段权限控制 REVOKE ALL ON water_customer FROM PUBLIC; GRANT SELECT (id, customer_name, phone) ON water_customer TO water_viewer; GRANT SELECT ON water_customer TO water_admin; ``` ### 3. 审计与监控 #### 3.1 审计日志配置 ```sql -- 启用审计 ALTER SYSTEM SET audit_enabled = on; ALTER SYSTEM SET audit_directory = '/data/audit'; ALTER SYSTEM SET audit_file_remain_threshold = 1024; -- 配置审计策略 SELECT pg_audit_set_policy('DDL_LOGIN_LOGOUT', 'DDL, LOGIN, LOGOUT'); SELECT pg_audit_set_policy('DML_DCL', 'DML, DCL'); ``` #### 3.2 敏感操作监控 ```sql -- 创建敏感操作触发器 CREATE OR REPLACE FUNCTION audit_sensitive_data() RETURNS TRIGGER AS $$ BEGIN INSERT INTO audit_log ( table_name, operation, old_values, new_values, user_name, operation_time ) VALUES ( TG_TABLE_NAME, TG_OP, row_to_json(OLD), row_to_json(NEW), current_user, current_timestamp ); RETURN COALESCE(NEW, OLD); END; $$ LANGUAGE plpgsql; -- 应用到敏感表 CREATE TRIGGER audit_customer_changes AFTER INSERT OR UPDATE OR DELETE ON water_customer FOR EACH ROW EXECUTE FUNCTION audit_sensitive_data(); ``` ### 4. 数据备份与灾备 #### 4.1 OpenGauss备份策略 ```sql -- 全量备份 gs_backup -D /data/backup -h localhost -p 5432 -U backup_user -- 增量备份 gs_backup -D /data/backup -h localhost -p 5432 -U backup_user --incremental -- 归档日志备份 ALTER SYSTEM SET archive_mode = on; ALTER SYSTEM SET archive_command = 'cp %p /data/archive/%f'; ``` #### 4.2 主备同步配置 ```sql -- 主库配置 ALTER SYSTEM SET synchronous_standby_names = 'standby1'; ALTER SYSTEM SET synchronous_commit = on; -- 备库配置 ALTER SYSTEM SET hot_standby = on; ALTER SYSTEM SET max_standby_streaming_delay = 30s; ``` ### 5. 国产化安全合规 #### 5.1 等保三级要求 - **身份鉴别**:支持多因子认证、密码复杂度策略 - **访问控制**:基于角色的强制访问控制 - **安全审计**:完整的操作审计和安全事件记录 - **数据完整性**:数据校验和完整性保护 - **数据保密性**:敏感数据加密存储和传输 #### 5.2 国产化认证 - 华为OpenGauss已通过国家密码管理局商用密码产品认证 - 支持国产SM2/SM3/SM4密码算法 - 符合《网络安全法》、《数据安全法》等法规要求 ```sql -- 使用国产SM4算法加密 CREATE TABLE water_customer_sm4 ( -- 字段定义... ) WITH (ENCRYPTION_TYPE = 'SM4_CTR');