775 lines
21 KiB
Markdown
775 lines
21 KiB
Markdown
# 泰豪电源 AI 数智化平台 - 数据库完整指南
|
||
|
||
> **更新日期**: 2025-12-02
|
||
> **数据库**: PostgreSQL 16
|
||
> **总表数**: 50张核心业务表
|
||
|
||
---
|
||
|
||
## 📖 目录
|
||
|
||
1. [系统概述](#1-系统概述)
|
||
2. [Schema架构](#2-schema架构)
|
||
3. [核心模块设计](#3-核心模块设计)
|
||
4. [表结构速查](#4-表结构速查)
|
||
5. [优化方案](#5-优化方案)
|
||
6. [部署与维护](#6-部署与维护)
|
||
7. [常用查询示例](#7-常用查询示例)
|
||
|
||
---
|
||
|
||
## 1. 系统概述
|
||
|
||
### 1.1 设计理念
|
||
|
||
基于`功能结构.xml`的系统架构,遵循 **"一个底座、多种智能体"** 核心理念,支持四大业务模块:
|
||
|
||
1. **资料管理智能化**
|
||
2. **招投标自动化**
|
||
3. **售后客服智能化**
|
||
4. **企业内部知识协同**
|
||
|
||
### 1.2 技术选型
|
||
|
||
- **数据库**: PostgreSQL 16
|
||
- **连接池**: HikariCP
|
||
- **ORM**: MyBatis-Plus 3.5
|
||
- **迁移工具**: Flyway (可选)
|
||
|
||
### 1.3 设计原则
|
||
|
||
- ✅ **模块化**: 按业务模块划分 Schema
|
||
- ✅ **规范化**: 统一命名规范和字段设计
|
||
- ✅ **可扩展**: 预留扩展字段和软删除
|
||
- ✅ **高性能**: 合理索引和分区设计
|
||
- ✅ **安全性**: 行级安全和审计日志
|
||
|
||
---
|
||
|
||
## 2. Schema架构
|
||
|
||
### 2.1 Schema划分
|
||
|
||
采用多Schema架构,按业务模块逻辑隔离:
|
||
|
||
| Schema | 说明 | 核心表数量 | 用途 |
|
||
|--------|------|-----------|------|
|
||
| `sys` | 系统基础模块 | 11 | 用户、角色、权限、部门 |
|
||
| `file` | 文件管理模块 | 1 | 文件存储与管理 |
|
||
| `message` | 消息通知模块 | 4 | 站内信、系统通知 |
|
||
| `log` | 日志审计模块 | 1 | 操作日志、审计 |
|
||
| `config` | 系统配置模块 | 1 | 系统参数配置 |
|
||
| `knowledge` | 知识库管理模块 | 4 | 文档、分段、问答对 |
|
||
| `bidding` | 招投标智能体 | 8 | 招投标业务流程 |
|
||
| `customer_service` | 智能客服系统 | 9 | 客服、工单、对话 |
|
||
| `agent` | 智能体管理 | 11 | 智能体、API、监控 |
|
||
|
||
**总计: 50张核心业务表**
|
||
|
||
### 2.2 命名规范
|
||
|
||
```sql
|
||
-- Schema 命名: 小写字母
|
||
CREATE SCHEMA IF NOT EXISTS sys;
|
||
|
||
-- 表命名: tb_{schema}_{表名}
|
||
CREATE TABLE sys.tb_sys_user (...);
|
||
CREATE TABLE knowledge.tb_knowledge_document (...);
|
||
|
||
-- 字段命名: 小写字母 + 下划线
|
||
user_id, create_time, full_name
|
||
|
||
-- 索引命名: idx_{表名}_{字段名}
|
||
CREATE INDEX idx_user_email ON sys.tb_sys_user(email);
|
||
|
||
-- 外键命名: fk_{表名}_{关联表名}
|
||
CONSTRAINT fk_user_dept FOREIGN KEY (dept_id) ...
|
||
```
|
||
|
||
---
|
||
|
||
## 3. 核心模块设计
|
||
|
||
### 3.1 系统基础模块 (sys)
|
||
|
||
#### 权限体系设计
|
||
|
||
采用 **RBAC (基于角色的访问控制) + ACL (访问控制列表)** 混合模型
|
||
|
||
**核心表**:
|
||
- `tb_sys_user` - 用户表
|
||
- `tb_sys_role` - 角色表
|
||
- `tb_sys_permission` - 权限表
|
||
- `tb_sys_dept` - 部门表
|
||
- `tb_sys_acl` - 对象级权限表
|
||
- `tb_sys_user_role` - 用户角色关联表
|
||
|
||
**权限模型**:
|
||
```
|
||
用户 (User)
|
||
├─ 部门 (Dept) - 数据隔离
|
||
├─ 角色 (Role)
|
||
│ ├─ 权限 (Permission) - 功能权限
|
||
│ └─ 视图 (View) - 菜单权限
|
||
└─ ACL - 对象级权限(细粒度)
|
||
```
|
||
|
||
**设计亮点**:
|
||
1. 多租户支持: `dept_path` 字段实现部门级数据隔离
|
||
2. 角色作用域: `scope` 字段区分全局/部门角色
|
||
3. 对象权限: ACL表支持任意对象的细粒度权限
|
||
|
||
#### 核心表结构
|
||
|
||
```sql
|
||
-- 用户表
|
||
CREATE TABLE sys.tb_sys_user (
|
||
user_id VARCHAR(50) PRIMARY KEY,
|
||
username VARCHAR(50) UNIQUE NOT NULL,
|
||
password_hash VARCHAR(255) NOT NULL,
|
||
email VARCHAR(100) UNIQUE,
|
||
phone VARCHAR(20),
|
||
wechat_id VARCHAR(100),
|
||
status VARCHAR(20) DEFAULT 'active',
|
||
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||
update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||
deleted BOOLEAN DEFAULT false
|
||
);
|
||
|
||
-- 部门表(树形结构)
|
||
CREATE TABLE sys.tb_sys_dept (
|
||
dept_id VARCHAR(50) PRIMARY KEY,
|
||
dept_name VARCHAR(100) NOT NULL,
|
||
parent_id VARCHAR(50),
|
||
dept_path TEXT, -- 路径:/1/2/3/
|
||
sort_order INTEGER DEFAULT 0,
|
||
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||
deleted BOOLEAN DEFAULT false,
|
||
CONSTRAINT fk_dept_parent FOREIGN KEY (parent_id)
|
||
REFERENCES sys.tb_sys_dept(dept_id)
|
||
);
|
||
|
||
-- 角色表
|
||
CREATE TABLE sys.tb_sys_role (
|
||
role_id VARCHAR(50) PRIMARY KEY,
|
||
role_name VARCHAR(100) NOT NULL,
|
||
role_code VARCHAR(50) UNIQUE NOT NULL,
|
||
scope VARCHAR(20) DEFAULT 'global', -- global/dept
|
||
owner_dept_id VARCHAR(50),
|
||
description TEXT,
|
||
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||
deleted BOOLEAN DEFAULT false
|
||
);
|
||
|
||
-- ACL权限表
|
||
CREATE TABLE sys.tb_sys_acl (
|
||
acl_id VARCHAR(50) PRIMARY KEY,
|
||
object_type VARCHAR(50) NOT NULL, -- user/dept/document等
|
||
object_id VARCHAR(50) NOT NULL,
|
||
principal_type VARCHAR(20) NOT NULL, -- user/role/dept
|
||
principal_id VARCHAR(50) NOT NULL,
|
||
permission VARCHAR(50) NOT NULL, -- view/edit/delete/admin
|
||
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||
);
|
||
|
||
-- 索引
|
||
CREATE INDEX idx_user_status ON sys.tb_sys_user(status) WHERE deleted = false;
|
||
CREATE INDEX idx_dept_path ON sys.tb_sys_dept USING GIN(dept_path gin_trgm_ops);
|
||
CREATE INDEX idx_acl_object ON sys.tb_sys_acl(object_type, object_id);
|
||
```
|
||
|
||
### 3.2 知识库管理模块 (knowledge)
|
||
|
||
#### 模块概述
|
||
|
||
支持文档管理、向量检索、RAG问答,版本控制。
|
||
|
||
**核心表**:
|
||
- `tb_knowledge_document` - 文档主表
|
||
- `tb_knowledge_chunk` - 文档分段表(向量检索)
|
||
- `tb_knowledge_qa_pair` - 问答对表
|
||
- `tb_knowledge_file_relation` - 文档文件关联表
|
||
|
||
#### 版本管理设计
|
||
|
||
采用 **简化版本管理** 方案:
|
||
|
||
```sql
|
||
-- 文档表(新增版本字段)
|
||
CREATE TABLE knowledge.tb_knowledge_document (
|
||
doc_id VARCHAR(50) PRIMARY KEY,
|
||
root_doc_id VARCHAR(50), -- ✨ 根文档ID(版本组标识)
|
||
version INTEGER DEFAULT 1, -- ✨ 版本号
|
||
is_current BOOLEAN DEFAULT true, -- ✨ 是否当前版本
|
||
title VARCHAR(500) NOT NULL,
|
||
content TEXT,
|
||
knowledge_base_id VARCHAR(50),
|
||
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||
deleted BOOLEAN DEFAULT false
|
||
);
|
||
|
||
-- 分段表(向量检索)
|
||
CREATE TABLE knowledge.tb_knowledge_chunk (
|
||
chunk_id VARCHAR(50) PRIMARY KEY,
|
||
doc_id VARCHAR(50) NOT NULL,
|
||
chunk_index INTEGER NOT NULL,
|
||
content TEXT NOT NULL,
|
||
embedding VECTOR(1536), -- ✨ 向量字段(pgvector扩展)
|
||
version INTEGER DEFAULT 1, -- ✨ 乐观锁版本
|
||
tokens INTEGER,
|
||
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||
CONSTRAINT fk_chunk_doc FOREIGN KEY (doc_id)
|
||
REFERENCES knowledge.tb_knowledge_document(doc_id)
|
||
);
|
||
|
||
-- 索引
|
||
CREATE INDEX idx_doc_root_current
|
||
ON knowledge.tb_knowledge_document(root_doc_id, is_current)
|
||
WHERE deleted = false;
|
||
|
||
CREATE INDEX idx_chunk_embedding
|
||
ON knowledge.tb_knowledge_chunk
|
||
USING ivfflat (embedding vector_cosine_ops) -- ✨ 向量索引
|
||
WITH (lists = 100);
|
||
```
|
||
|
||
**版本管理示例**:
|
||
|
||
```sql
|
||
-- 创建新版本
|
||
BEGIN;
|
||
|
||
-- 1. 标记旧版本为非当前
|
||
UPDATE knowledge.tb_knowledge_document
|
||
SET is_current = false
|
||
WHERE root_doc_id = 'root_xxx';
|
||
|
||
-- 2. 插入新版本
|
||
INSERT INTO knowledge.tb_knowledge_document (
|
||
doc_id, root_doc_id, version, is_current, title, content
|
||
) VALUES (
|
||
'new_doc_id', 'root_xxx', 2, true, '新版本标题', '内容'
|
||
);
|
||
|
||
COMMIT;
|
||
|
||
-- 查询当前版本
|
||
SELECT * FROM knowledge.tb_knowledge_document
|
||
WHERE root_doc_id = 'root_xxx' AND is_current = true;
|
||
|
||
-- 查询所有版本
|
||
SELECT version, title, create_time
|
||
FROM knowledge.tb_knowledge_document
|
||
WHERE root_doc_id = 'root_xxx'
|
||
ORDER BY version DESC;
|
||
```
|
||
|
||
### 3.3 招投标智能体模块 (bidding)
|
||
|
||
#### 核心表
|
||
|
||
```sql
|
||
-- 招标项目表
|
||
CREATE TABLE bidding.tb_bidding_project (
|
||
project_id VARCHAR(50) PRIMARY KEY,
|
||
project_name VARCHAR(500) NOT NULL,
|
||
project_code VARCHAR(100),
|
||
bidding_org VARCHAR(200), -- 招标单位
|
||
project_type VARCHAR(50), -- 项目类型
|
||
status VARCHAR(50) DEFAULT 'draft',
|
||
budget DECIMAL(18,2),
|
||
bid_deadline TIMESTAMP,
|
||
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||
deleted BOOLEAN DEFAULT false
|
||
);
|
||
|
||
-- 招标文件表
|
||
CREATE TABLE bidding.tb_bidding_document (
|
||
doc_id VARCHAR(50) PRIMARY KEY,
|
||
project_id VARCHAR(50) NOT NULL,
|
||
doc_type VARCHAR(50), -- tender/technical/commercial
|
||
file_id VARCHAR(50),
|
||
parsed_content JSONB, -- ✨ 智能解析结果
|
||
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||
CONSTRAINT fk_bdoc_project FOREIGN KEY (project_id)
|
||
REFERENCES bidding.tb_bidding_project(project_id)
|
||
);
|
||
|
||
-- 标书模板表
|
||
CREATE TABLE bidding.tb_bidding_template (
|
||
template_id VARCHAR(50) PRIMARY KEY,
|
||
template_name VARCHAR(200) NOT NULL,
|
||
template_type VARCHAR(50),
|
||
content JSONB, -- 模板结构化内容
|
||
variables JSONB, -- 可替换变量
|
||
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||
);
|
||
```
|
||
|
||
### 3.4 智能客服系统模块 (customer_service)
|
||
|
||
#### 核心表
|
||
|
||
```sql
|
||
-- 对话会话表
|
||
CREATE TABLE customer_service.tb_cs_conversation (
|
||
conv_id VARCHAR(50) PRIMARY KEY,
|
||
customer_user_id VARCHAR(50),
|
||
customer_name VARCHAR(100),
|
||
channel VARCHAR(50), -- wechat/web/phone
|
||
source VARCHAR(50), -- miniprogram/h5/app
|
||
status VARCHAR(50) DEFAULT 'active',
|
||
start_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||
end_time TIMESTAMP,
|
||
satisfaction_score INTEGER -- 满意度评分
|
||
);
|
||
|
||
-- 对话消息表
|
||
CREATE TABLE customer_service.tb_cs_message (
|
||
message_id VARCHAR(50) PRIMARY KEY,
|
||
conv_id VARCHAR(50) NOT NULL,
|
||
sender_type VARCHAR(20), -- customer/agent/bot
|
||
sender_id VARCHAR(50),
|
||
content TEXT,
|
||
message_type VARCHAR(50), -- text/image/file
|
||
ai_response JSONB, -- AI响应详情
|
||
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||
CONSTRAINT fk_msg_conv FOREIGN KEY (conv_id)
|
||
REFERENCES customer_service.tb_cs_conversation(conv_id)
|
||
);
|
||
|
||
-- 工单表
|
||
CREATE TABLE customer_service.tb_cs_work_order (
|
||
order_id VARCHAR(50) PRIMARY KEY,
|
||
order_code VARCHAR(100) UNIQUE NOT NULL,
|
||
conv_id VARCHAR(50),
|
||
customer_user_id VARCHAR(50),
|
||
title VARCHAR(500) NOT NULL,
|
||
description TEXT,
|
||
category VARCHAR(100),
|
||
priority VARCHAR(20) DEFAULT 'medium',
|
||
status VARCHAR(50) DEFAULT 'pending',
|
||
assigned_to VARCHAR(50),
|
||
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||
resolve_time TIMESTAMP
|
||
);
|
||
```
|
||
|
||
### 3.5 智能体管理模块 (agent)
|
||
|
||
#### 核心表
|
||
|
||
```sql
|
||
-- 智能体定义表
|
||
CREATE TABLE agent.tb_agent_definition (
|
||
agent_id VARCHAR(50) PRIMARY KEY,
|
||
agent_name VARCHAR(100) NOT NULL,
|
||
agent_type VARCHAR(50), -- bidding/cs/knowledge等
|
||
description TEXT,
|
||
config JSONB, -- 配置(模型、参数等)
|
||
status VARCHAR(20) DEFAULT 'active',
|
||
version VARCHAR(20),
|
||
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||
);
|
||
|
||
-- API调用日志表
|
||
CREATE TABLE agent.tb_agent_api_log (
|
||
log_id VARCHAR(50) PRIMARY KEY,
|
||
agent_id VARCHAR(50),
|
||
api_endpoint VARCHAR(200),
|
||
request_params JSONB,
|
||
response_data JSONB,
|
||
status_code INTEGER,
|
||
duration_ms INTEGER,
|
||
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||
);
|
||
|
||
-- 智能体监控表(按月分区)
|
||
CREATE TABLE agent.tb_agent_monitor (
|
||
monitor_id VARCHAR(50) NOT NULL,
|
||
agent_id VARCHAR(50) NOT NULL,
|
||
metric_name VARCHAR(100),
|
||
metric_value NUMERIC,
|
||
timestamp TIMESTAMP NOT NULL,
|
||
PRIMARY KEY (monitor_id, timestamp)
|
||
) PARTITION BY RANGE (timestamp);
|
||
|
||
-- 创建分区
|
||
CREATE TABLE agent.tb_agent_monitor_2025_12
|
||
PARTITION OF agent.tb_agent_monitor
|
||
FOR VALUES FROM ('2025-12-01') TO ('2026-01-01');
|
||
```
|
||
|
||
---
|
||
|
||
## 4. 表结构速查
|
||
|
||
### 4.1 系统基础模块 (sys)
|
||
|
||
| 表名 | 主键 | 核心字段 | 说明 |
|
||
|------|------|----------|------|
|
||
| `tb_sys_user` | user_id | username, email, phone | 用户表 |
|
||
| `tb_sys_user_info` | user_id | avatar, full_name, level | 用户信息表 |
|
||
| `tb_sys_dept` | dept_id | name, parent_id, dept_path | 部门表 |
|
||
| `tb_sys_role` | role_id | name, scope, owner_dept_id | 角色表 |
|
||
| `tb_sys_permission` | permission_id | name, code, module_id | 权限表 |
|
||
| `tb_sys_acl` | acl_id | object_type, principal_type | 对象权限表 |
|
||
|
||
### 4.2 知识库管理 (knowledge)
|
||
|
||
| 表名 | 主键 | 核心字段 | 说明 |
|
||
|------|------|----------|------|
|
||
| `tb_knowledge_document` | doc_id | title, root_doc_id, version | 文档表 |
|
||
| `tb_knowledge_chunk` | chunk_id | doc_id, content, embedding | 分段表 |
|
||
| `tb_knowledge_qa_pair` | qa_pair_id | question, answer | 问答对表 |
|
||
|
||
### 4.3 招投标 (bidding)
|
||
|
||
| 表名 | 主键 | 核心字段 | 说明 |
|
||
|------|------|----------|------|
|
||
| `tb_bidding_project` | project_id | project_name, status | 招标项目表 |
|
||
| `tb_bidding_document` | doc_id | project_id, parsed_content | 招标文件表 |
|
||
| `tb_bidding_template` | template_id | template_name, content | 标书模板表 |
|
||
|
||
### 4.4 智能客服 (customer_service)
|
||
|
||
| 表名 | 主键 | 核心字段 | 说明 |
|
||
|------|------|----------|------|
|
||
| `tb_cs_conversation` | conv_id | customer_user_id, status | 对话会话表 |
|
||
| `tb_cs_message` | message_id | conv_id, content | 对话消息表 |
|
||
| `tb_cs_work_order` | order_id | title, status, assigned_to | 工单表 |
|
||
|
||
---
|
||
|
||
## 5. 优化方案
|
||
|
||
### 5.1 索引优化
|
||
|
||
```sql
|
||
-- 1. 复合索引(状态 + 时间查询)
|
||
CREATE INDEX idx_project_status_time
|
||
ON bidding.tb_bidding_project(status, create_time DESC)
|
||
WHERE deleted = false;
|
||
|
||
-- 2. 部分索引(只索引活跃数据)
|
||
CREATE INDEX idx_user_active
|
||
ON sys.tb_sys_user(user_id)
|
||
WHERE status = 'active' AND deleted = false;
|
||
|
||
-- 3. GIN索引(全文检索)
|
||
CREATE INDEX idx_doc_content_gin
|
||
ON knowledge.tb_knowledge_document
|
||
USING GIN(to_tsvector('chinese', title || ' ' || content));
|
||
|
||
-- 4. BRIN索引(时间序列)
|
||
CREATE INDEX idx_log_time_brin
|
||
ON log.tb_operation_log
|
||
USING BRIN(create_time);
|
||
```
|
||
|
||
### 5.2 分区策略
|
||
|
||
```sql
|
||
-- 按月分区(监控数据)
|
||
CREATE TABLE agent.tb_agent_monitor (
|
||
monitor_id VARCHAR(50) NOT NULL,
|
||
timestamp TIMESTAMP NOT NULL,
|
||
...
|
||
PRIMARY KEY (monitor_id, timestamp)
|
||
) PARTITION BY RANGE (timestamp);
|
||
|
||
-- 自动创建分区脚本
|
||
CREATE OR REPLACE FUNCTION create_monthly_partition()
|
||
RETURNS void AS $$
|
||
DECLARE
|
||
start_date DATE;
|
||
end_date DATE;
|
||
partition_name TEXT;
|
||
BEGIN
|
||
start_date := DATE_TRUNC('month', CURRENT_DATE + INTERVAL '1 month');
|
||
end_date := start_date + INTERVAL '1 month';
|
||
partition_name := 'tb_agent_monitor_' || TO_CHAR(start_date, 'YYYY_MM');
|
||
|
||
EXECUTE format(
|
||
'CREATE TABLE IF NOT EXISTS agent.%I PARTITION OF agent.tb_agent_monitor
|
||
FOR VALUES FROM (%L) TO (%L)',
|
||
partition_name, start_date, end_date
|
||
);
|
||
END;
|
||
$$ LANGUAGE plpgsql;
|
||
```
|
||
|
||
### 5.3 查询优化
|
||
|
||
```sql
|
||
-- 使用CTE优化复杂查询
|
||
WITH user_roles AS (
|
||
SELECT ur.user_id, r.role_id, r.role_code
|
||
FROM sys.tb_sys_user_role ur
|
||
JOIN sys.tb_sys_role r ON ur.role_id = r.role_id
|
||
WHERE r.deleted = false
|
||
),
|
||
user_permissions AS (
|
||
SELECT ur.user_id, p.permission_code
|
||
FROM user_roles ur
|
||
JOIN sys.tb_sys_role_permission rp ON ur.role_id = rp.role_id
|
||
JOIN sys.tb_sys_permission p ON rp.permission_id = p.permission_id
|
||
)
|
||
SELECT u.username, array_agg(DISTINCT up.permission_code) as permissions
|
||
FROM sys.tb_sys_user u
|
||
JOIN user_permissions up ON u.user_id = up.user_id
|
||
WHERE u.deleted = false
|
||
GROUP BY u.user_id, u.username;
|
||
```
|
||
|
||
### 5.4 并发控制
|
||
|
||
```sql
|
||
-- 乐观锁(版本号)
|
||
UPDATE knowledge.tb_knowledge_chunk
|
||
SET content = '新内容',
|
||
version = version + 1
|
||
WHERE chunk_id = 'xxx'
|
||
AND version = 1; -- 版本匹配才更新
|
||
|
||
-- 悲观锁
|
||
BEGIN;
|
||
SELECT * FROM bidding.tb_bidding_project
|
||
WHERE project_id = 'xxx'
|
||
FOR UPDATE; -- 锁定记录
|
||
|
||
-- 更新...
|
||
COMMIT;
|
||
```
|
||
|
||
---
|
||
|
||
## 6. 部署与维护
|
||
|
||
### 6.1 初始化脚本
|
||
|
||
```bash
|
||
# 位置: urbanLifelineServ/.bin/database/postgres/sql/
|
||
|
||
# 完整初始化
|
||
psql -U postgres -d urban_lifeline -f createTableAll.sql
|
||
|
||
# 分模块初始化
|
||
psql -U postgres -d urban_lifeline -f createTablePermission.sql
|
||
psql -U postgres -d urban_lifeline -f createTableKnowledge.sql
|
||
psql -U postgres -d urban_lifeline -f createTableBidding.sql
|
||
|
||
# 优化补丁
|
||
psql -U postgres -d urban_lifeline -f optimizations.sql
|
||
```
|
||
|
||
### 6.2 备份策略
|
||
|
||
```bash
|
||
# 全量备份
|
||
pg_dump -U postgres -d urban_lifeline -F c -f backup_$(date +%Y%m%d).dump
|
||
|
||
# 仅备份 Schema
|
||
pg_dump -U postgres -d urban_lifeline -s -f schema_backup.sql
|
||
|
||
# 仅备份数据
|
||
pg_dump -U postgres -d urban_lifeline -a -f data_backup.sql
|
||
|
||
# 还原
|
||
pg_restore -U postgres -d urban_lifeline backup_20251202.dump
|
||
```
|
||
|
||
### 6.3 监控指标
|
||
|
||
```sql
|
||
-- 表大小
|
||
SELECT
|
||
schemaname,
|
||
tablename,
|
||
pg_size_pretty(pg_total_relation_size(schemaname||'.'||tablename)) as size
|
||
FROM pg_tables
|
||
WHERE schemaname NOT IN ('pg_catalog', 'information_schema')
|
||
ORDER BY pg_total_relation_size(schemaname||'.'||tablename) DESC;
|
||
|
||
-- 索引使用情况
|
||
SELECT
|
||
schemaname, tablename, indexname,
|
||
idx_scan as index_scans,
|
||
idx_tup_read as tuples_read
|
||
FROM pg_stat_user_indexes
|
||
WHERE idx_scan = 0
|
||
ORDER BY schemaname, tablename;
|
||
|
||
-- 慢查询
|
||
SELECT
|
||
query,
|
||
calls,
|
||
total_time,
|
||
mean_time,
|
||
max_time
|
||
FROM pg_stat_statements
|
||
WHERE mean_time > 1000 -- 超过1秒
|
||
ORDER BY mean_time DESC
|
||
LIMIT 10;
|
||
```
|
||
|
||
---
|
||
|
||
## 7. 常用查询示例
|
||
|
||
### 7.1 用户权限查询
|
||
|
||
```sql
|
||
-- 查询用户的所有权限
|
||
SELECT DISTINCT p.permission_code, p.permission_name
|
||
FROM sys.tb_sys_user u
|
||
JOIN sys.tb_sys_user_role ur ON u.user_id = ur.user_id
|
||
JOIN sys.tb_sys_role_permission rp ON ur.role_id = rp.role_id
|
||
JOIN sys.tb_sys_permission p ON rp.permission_id = p.permission_id
|
||
WHERE u.username = 'admin'
|
||
AND u.deleted = false;
|
||
|
||
-- 查询部门下所有用户
|
||
WITH RECURSIVE dept_tree AS (
|
||
SELECT dept_id FROM sys.tb_sys_dept WHERE dept_id = 'target_dept_id'
|
||
UNION ALL
|
||
SELECT d.dept_id
|
||
FROM sys.tb_sys_dept d
|
||
JOIN dept_tree dt ON d.parent_id = dt.dept_id
|
||
)
|
||
SELECT u.*
|
||
FROM sys.tb_sys_user u
|
||
JOIN sys.tb_sys_user_dept ud ON u.user_id = ud.user_id
|
||
WHERE ud.dept_id IN (SELECT dept_id FROM dept_tree);
|
||
```
|
||
|
||
### 7.2 知识库查询
|
||
|
||
```sql
|
||
-- 向量相似度检索(Top 5)
|
||
SELECT
|
||
chunk_id,
|
||
content,
|
||
1 - (embedding <=> '[0.1, 0.2, ...]'::vector) as similarity
|
||
FROM knowledge.tb_knowledge_chunk
|
||
WHERE deleted = false
|
||
ORDER BY embedding <=> '[0.1, 0.2, ...]'::vector
|
||
LIMIT 5;
|
||
|
||
-- 查询文档的所有版本
|
||
SELECT
|
||
version,
|
||
title,
|
||
create_time,
|
||
is_current
|
||
FROM knowledge.tb_knowledge_document
|
||
WHERE root_doc_id = 'root_xxx'
|
||
ORDER BY version DESC;
|
||
```
|
||
|
||
### 7.3 招投标查询
|
||
|
||
```sql
|
||
-- 统计项目状态分布
|
||
SELECT
|
||
status,
|
||
COUNT(*) as count,
|
||
SUM(budget) as total_budget
|
||
FROM bidding.tb_bidding_project
|
||
WHERE deleted = false
|
||
GROUP BY status;
|
||
|
||
-- 查询即将截止的项目
|
||
SELECT
|
||
project_name,
|
||
bid_deadline,
|
||
EXTRACT(DAY FROM (bid_deadline - NOW())) as days_left
|
||
FROM bidding.tb_bidding_project
|
||
WHERE status = 'active'
|
||
AND bid_deadline > NOW()
|
||
AND deleted = false
|
||
ORDER BY bid_deadline ASC;
|
||
```
|
||
|
||
### 7.4 智能客服查询
|
||
|
||
```sql
|
||
-- 查询工单处理效率
|
||
SELECT
|
||
assigned_to,
|
||
COUNT(*) as total_orders,
|
||
AVG(EXTRACT(EPOCH FROM (resolve_time - create_time))/3600) as avg_hours,
|
||
COUNT(CASE WHEN status = 'resolved' THEN 1 END) as resolved_count
|
||
FROM customer_service.tb_cs_work_order
|
||
WHERE create_time > NOW() - INTERVAL '30 days'
|
||
GROUP BY assigned_to;
|
||
|
||
-- 查询满意度统计
|
||
SELECT
|
||
DATE(start_time) as date,
|
||
AVG(satisfaction_score) as avg_satisfaction,
|
||
COUNT(*) as total_conversations
|
||
FROM customer_service.tb_cs_conversation
|
||
WHERE satisfaction_score IS NOT NULL
|
||
AND start_time > NOW() - INTERVAL '7 days'
|
||
GROUP BY DATE(start_time)
|
||
ORDER BY date DESC;
|
||
```
|
||
|
||
---
|
||
|
||
## 附录
|
||
|
||
### A. SQL文件清单
|
||
|
||
```
|
||
urbanLifelineServ/.bin/database/postgres/sql/
|
||
├── createTableAll.sql # 完整初始化
|
||
├── createTablePermission.sql # 权限模块
|
||
├── createTableUser.sql # 用户模块
|
||
├── createTableFile.sql # 文件模块
|
||
├── createTableMessage.sql # 消息模块
|
||
├── createTableLog.sql # 日志模块
|
||
├── createTableConfig.sql # 配置模块
|
||
├── createTableKnowledge.sql # 知识库模块 ✨
|
||
├── createTableBidding.sql # 招投标模块 ✨
|
||
├── createTableCustomerService.sql # 智能客服模块 ✨
|
||
├── createTableAgent.sql # 智能体管理模块 ✨
|
||
├── optimizations.sql # 优化补丁 ✨
|
||
├── initDataPermission.sql # 权限初始数据
|
||
├── initDataUser.sql # 用户初始数据
|
||
└── initAll.sql # 完整初始化(表+数据)
|
||
```
|
||
|
||
### B. 扩展插件
|
||
|
||
```sql
|
||
-- 向量检索
|
||
CREATE EXTENSION IF NOT EXISTS vector;
|
||
|
||
-- 全文检索(中文)
|
||
CREATE EXTENSION IF NOT EXISTS zhparser;
|
||
CREATE TEXT SEARCH CONFIGURATION chinese (PARSER = zhparser);
|
||
|
||
-- 模糊匹配
|
||
CREATE EXTENSION IF NOT EXISTS pg_trgm;
|
||
|
||
-- UUID生成
|
||
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
|
||
```
|
||
|
||
### C. 性能基准
|
||
|
||
| 指标 | 目标值 | 说明 |
|
||
|------|--------|------|
|
||
| 单表查询 | < 100ms | 主键/索引查询 |
|
||
| 复杂查询 | < 500ms | 多表JOIN |
|
||
| 向量检索 | < 200ms | Top-K检索 |
|
||
| 写入TPS | > 1000 | 批量插入 |
|
||
| 并发连接 | 200+ | HikariCP连接池 |
|
||
|
||
---
|
||
|
||
**最后更新**: 2025-12-02
|
||
**维护者**: Urban Lifeline Team
|