# 专题和评论系统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+环境编写,建议在测试环境中先验证所有功能后再部署到生产环境。*