Files
akmon/doc_news/SQL_DEPLOYMENT_GUIDE.md
2026-01-20 08:04:15 +08:00

423 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 专题和评论系统SQL部署指南
本文档包含了多语言AI资讯系统中专题和评论功能的完整SQL部署指南。
## 📋 部署文件清单
### 1. 主数据库结构文件
- **文件名**: `ai_multilingual_news_database.sql`
- **用途**: 创建完整的数据库结构,包括专题和评论系统
- **包含内容**:
- 所有基础表结构
- 专题系统表 (ak_topics, ak_topic_contents, ak_topic_subscriptions)
- 评论系统表 (ak_comments, ak_comment_reactions, ak_comment_reports, ak_comment_moderation_queue)
- 索引、约束、触发器
- 基础配置数据
### 2. 演示数据文件
- **文件名**: `topics_comments_init_data.sql`
- **用途**: 插入专题和评论系统的演示数据
- **包含内容**:
- 5个不同类型的演示专题
- 多层级评论结构
- 点赞、举报、审核数据
- 统计数据更新
### 3. 修复版演示数据(备用)
- **文件名**: `demo_topics_comments_data_fixed.sql`
- **用途**: 兼容性更好的演示数据版本
- **特点**: 移除了一些高级PostgreSQL语法提高兼容性
## 🚀 部署步骤
### 第一步:创建数据库结构
```bash
# 执行主数据库结构文件
psql -U username -d database_name -f ai_multilingual_news_database.sql
```
### 第二步:插入演示数据
```bash
# 执行演示数据文件
psql -U username -d database_name -f topics_comments_init_data.sql
```
### 第三步:验证部署
```sql
-- 检查专题表
SELECT COUNT(*) FROM ak_topics;
-- 检查评论表
SELECT COUNT(*) FROM ak_comments;
-- 检查数据完整性
SELECT
t.title,
t.content_count,
t.comment_count,
t.subscriber_count
FROM ak_topics t
ORDER BY t.priority_level DESC;
```
## 📊 数据库表结构概览
### 专题系统表
#### ak_topics (专题表)
- **主要字段**: id, title, description, topic_type, status, creator_id
- **统计字段**: content_count, view_count, like_count, comment_count, subscriber_count
- **SEO字段**: meta_keywords, meta_description, seo_slug
- **分类**: 8种专题类型 (breaking, trending, series, analysis, guide, interview, report, timeline)
#### ak_topic_contents (专题内容关联表)
- **关联**: topic_id -> ak_topics, content_id -> ak_contents
- **排序**: display_order
- **标识**: is_featured, editor_note
#### ak_topic_subscriptions (专题订阅表)
- **关联**: topic_id -> ak_topics, user_id
- **设置**: notification_enabled
- **统计**: subscribed_at, last_notified_at
### 评论系统表
#### ak_comments (评论表)
- **目标**: target_type ('content'/'topic'), target_id
- **层级**: parent_id, level (0-2), thread_path
- **内容**: content, content_html, author_id, author_name
- **统计**: like_count, dislike_count, reply_count
- **质量**: quality_score, sentiment_score, ai_analysis
- **审核**: status, moderation_flags, is_pinned
#### ak_comment_reactions (评论反应表)
- **反应**: like, dislike, love, laugh, angry, sad
- **唯一**: (comment_id, user_id, reaction_type)
#### ak_comment_reports (评论举报表)
- **类型**: spam, inappropriate, harassment, misinformation, copyright
- **流程**: pending -> reviewed -> resolved/dismissed
#### ak_comment_moderation_queue (审核队列表)
- **AI支持**: ai_risk_score, ai_recommendations
- **分配**: assigned_to, priority_level
- **状态**: pending -> in_progress -> completed
### 收藏系统表
#### ak_content_favorites (内容收藏表)
- **目标**: target_type ('content'/'topic'), target_id
- **分类**: folder_id, notes, tags
- **权限**: is_public
- **关联**: user_id
#### ak_favorite_folders (收藏夹表)
- **基本**: name, description, icon, color
- **属性**: is_default, is_public, item_count
- **排序**: display_order
- **统计**: 触发器自动维护item_count
#### ak_favorite_shares (收藏夹分享表)
- **分享**: share_code, share_type, access_password
- **统计**: view_count, clone_count
- **有效期**: expire_at, is_active
### 转发分享系统表
#### ak_content_shares (内容转发分享表)
- **目标**: target_type ('content'/'topic'/'comment'), target_id
- **类型**: share_type (forward/quote/repost/link)
- **平台**: share_platform (internal/wechat/weibo/twitter/facebook等)
- **转发链**: parent_share_id, share_level
- **统计**: reach_count, click_count, like_count, reshare_count
- **内容**: share_content, share_title
- **分析**: ip_address, user_agent, device_info, geo_location
#### ak_share_analytics (分享统计分析表)
- **维度**: target_type, target_id, date_recorded, platform
- **指标**: share_count, unique_sharers, total_reach, total_clicks
- **分析**: avg_share_level, viral_coefficient
- **聚合**: 按日期和平台统计
## 🔧 核心功能SQL
### 专题管理
#### 创建专题
```sql
INSERT INTO ak_topics (title, description, topic_type, status, creator_id)
VALUES ('专题标题', '专题描述', 'series', 'active', 'user_id');
```
#### 添加专题内容
```sql
INSERT INTO ak_topic_contents (topic_id, content_id, display_order, is_featured)
VALUES ('topic_id', 'content_id', 1, true);
```
#### 订阅专题
```sql
INSERT INTO ak_topic_subscriptions (topic_id, user_id, notification_enabled)
VALUES ('topic_id', 'user_id', true)
ON CONFLICT (topic_id, user_id) DO NOTHING;
```
### 评论管理
#### 发布顶级评论
```sql
INSERT INTO ak_comments (
target_type, target_id, author_id, author_name, content,
level, thread_path
) VALUES (
'content', 'content_id', 'user_id', '用户名', '评论内容',
0, '0001'
);
```
#### 回复评论
```sql
INSERT INTO ak_comments (
target_type, target_id, parent_id, author_id, author_name, content,
level, thread_path
) VALUES (
'content', 'content_id', 'parent_comment_id', 'user_id', '用户名', '回复内容',
1, '0001.0001'
);
```
#### 点赞评论
```sql
INSERT INTO ak_comment_reactions (comment_id, user_id, reaction_type)
VALUES ('comment_id', 'user_id', 'like')
ON CONFLICT (comment_id, user_id, reaction_type) DO NOTHING;
```
#### 举报评论
```sql
INSERT INTO ak_comment_reports (comment_id, reporter_id, report_type, report_reason)
VALUES ('comment_id', 'reporter_id', 'inappropriate', '举报原因');
```
### 收藏管理
#### 创建收藏夹
```sql
INSERT INTO ak_favorite_folders (user_id, name, description, icon, color, is_default)
VALUES ('user_id', '收藏夹名称', '描述', 'star', '#FFD700', false);
```
#### 收藏内容/专题
```sql
INSERT INTO ak_content_favorites (
user_id, target_type, target_id, folder_id, notes, tags, is_public
) VALUES (
'user_id', 'content', 'content_id', 'folder_id', '收藏备注',
ARRAY['标签1', '标签2'], false
)
ON CONFLICT (user_id, target_type, target_id) DO NOTHING;
```
#### 分享收藏夹
```sql
INSERT INTO ak_favorite_shares (folder_id, shared_by, share_type, access_password)
VALUES ('folder_id', 'user_id', 'public', NULL);
```
### 转发分享管理
#### 分享内容
```sql
INSERT INTO ak_content_shares (
user_id, target_type, target_id, share_type, share_platform,
share_content, original_author_id, share_level
) VALUES (
'user_id', 'content', 'content_id', 'forward', 'wechat',
'分享时的评论内容', 'original_author_id', 0
);
```
#### 转发链条
```sql
INSERT INTO ak_content_shares (
user_id, target_type, target_id, share_type, share_platform,
parent_share_id, share_level
) VALUES (
'user_id', 'content', 'content_id', 'repost', 'internal',
'parent_share_id', 1
);
```
#### 查询分享统计
```sql
SELECT
target_type,
COUNT(*) as total_shares,
COUNT(DISTINCT user_id) as unique_sharers,
SUM(reach_count) as total_reach,
AVG(viral_coefficient) as avg_viral_coefficient
FROM ak_content_shares
WHERE created_at >= now() - interval '7 days'
GROUP BY target_type;
```
## 📈 统计查询
### 专题统计
```sql
-- 专题概览
SELECT
t.title,
t.topic_type,
t.status,
t.content_count,
t.view_count,
t.comment_count,
t.subscriber_count,
t.created_at
FROM ak_topics t
ORDER BY t.priority_level DESC, t.view_count DESC;
-- 热门专题
SELECT
t.title,
t.view_count + t.like_count * 5 + t.comment_count * 3 as popularity_score
FROM ak_topics t
WHERE t.status = 'active'
ORDER BY popularity_score DESC
LIMIT 10;
```
### 评论统计
```sql
-- 评论层级结构
SELECT
c.id,
c.level,
c.thread_path,
c.author_name,
SUBSTRING(c.content, 1, 50) || '...' as preview,
c.like_count,
c.reply_count,
c.created_at
FROM ak_comments c
WHERE c.target_type = 'content' AND c.target_id = 'content_id'
ORDER BY c.thread_path;
-- 评论质量分析
SELECT
c.author_name,
AVG(c.quality_score) as avg_quality,
AVG(c.sentiment_score) as avg_sentiment,
COUNT(*) as comment_count,
SUM(c.like_count) as total_likes
FROM ak_comments c
WHERE c.status = 'active'
GROUP BY c.author_name
HAVING COUNT(*) >= 3
ORDER BY avg_quality DESC;
```
## 🛡️ 安全和性能
### 索引优化
- 专题查询topic_type, status, priority_level, view_count
- 评论查询target_type + target_id, thread_path, author_id
- 反应查询comment_id + reaction_type, user_id
### 数据完整性
- 外键约束确保数据一致性
- 唯一约束防止重复数据
- 触发器自动更新统计数据
### 审核机制
- AI自动评分和标记
- 人工审核队列
- 举报处理流程
- 软删除支持
## 🔄 维护和更新
### 定期维护SQL
```sql
-- 清理过期的软删除评论
DELETE FROM ak_comments
WHERE deleted_at < now() - interval '90 days';
-- 更新专题统计
UPDATE ak_topics SET
content_count = (SELECT COUNT(*) FROM ak_topic_contents WHERE topic_id = ak_topics.id),
comment_count = (SELECT COUNT(*) FROM ak_comments WHERE target_type = 'topic' AND target_id = ak_topics.id AND status = 'active'),
subscriber_count = (SELECT COUNT(*) FROM ak_topic_subscriptions WHERE topic_id = ak_topics.id);
-- 分析评论质量趋势
SELECT
DATE_TRUNC('day', created_at) as date,
AVG(quality_score) as avg_quality,
COUNT(*) as comment_count
FROM ak_comments
WHERE created_at >= now() - interval '30 days'
GROUP BY DATE_TRUNC('day', created_at)
ORDER BY date;
```
### 性能监控
```sql
-- 查询慢查询
SELECT
schemaname,
tablename,
n_tup_ins + n_tup_upd + n_tup_del as total_writes,
seq_scan,
seq_tup_read,
idx_scan,
idx_tup_fetch
FROM pg_stat_user_tables
WHERE schemaname = 'public'
AND tablename IN ('ak_topics', 'ak_comments', 'ak_comment_reactions')
ORDER BY total_writes DESC;
```
## 📝 注意事项
1. **UUID类型**: 所有ID字段使用UUID类型确保全局唯一性
2. **时区处理**: 所有时间字段使用`TIMESTAMP WITH TIME ZONE`
3. **文本搜索**: 支持全文搜索的字段已建立GIN索引
4. **数组字段**: tags、keywords等使用PostgreSQL数组类型
5. **JSON字段**: 扩展属性使用JSONB类型存储
6. **软删除**: 支持软删除机制,数据不会物理删除
7. **触发器**: 自动维护统计数据,减少手动更新需求
## 🚨 故障排除
### 常见问题
1. **外键约束错误**: 确保引用的记录存在
2. **重复数据错误**: 检查唯一约束
3. **权限问题**: 确保数据库用户有足够权限
4. **性能问题**: 检查索引使用情况
### 数据恢复
```sql
-- 恢复误删的评论
UPDATE ak_comments
SET status = 'active', deleted_at = NULL
WHERE id = 'comment_id' AND status = 'deleted';
-- 重建统计数据
SELECT update_all_topic_stats();
SELECT update_all_comment_stats();
```
## 📞 支持
如果在部署过程中遇到问题,请检查:
1. PostgreSQL版本是否为15+
2. 必要的扩展是否已安装
3. 数据库用户权限是否足够
4. 字符编码是否设置为UTF-8
---
*本文档基于PostgreSQL 15+环境编写,建议在测试环境中先验证所有功能后再部署到生产环境。*