首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

QQ 空間動態評論回復數據庫設計:三表關聯 vs 遞歸自關聯優化方案

     編輯:程式設計綜合問答

原始設計痛點

三表分離(動態表、評論表、回復表),導致:

  • 查詢動態詳情需多次 JOIN/子查詢
  • 回復層級固定為 2 層(評論→回復),無法支持多層嵌套
  • 統計聚合(評論數、回復數)需多表掃描

優化方案:單表遞歸自關聯 (Adjacency List)

CREATE TABLE dynamic_content (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    user_id BIGINT NOT NULL,           -- 發布者
    content_type TINYINT NOT NULL,     -- 1:動態 2:評論 3:回復
    parent_id BIGINT DEFAULT 0,        -- 父內容 ID,0 表示頂層動態
    root_id BIGINT DEFAULT 0,          -- 根動態 ID,便於查詢整條鏈
    content TEXT NOT NULL,
    create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
    like_count INT DEFAULT 0,
    reply_count INT DEFAULT 0,         -- 直接子回復數,冗余字段加速統計
    INDEX idx_user_time (user_id, create_time),
    INDEX idx_parent (parent_id),
    INDEX idx_root (root_id)
);

核心查詢模式

  • 獲取動態及一級評論:SELECT * FROM dynamic_content WHERE root_id=0 AND id=? UNION SELECT * WHERE parent_id=? ORDER BY create_time
  • 遞歸獲取所有回復:應用層遞歸或 WITH RECURSIVE (MySQL 8.0+)
  • 用戶動態列表:WHERE user_id=? AND content_type=1

關鍵優勢

大數據量擴展

  • 分表:按 root_id 哈希分片,同一動態鏈路落同一分片
  • 緩存:熱門動態鏈路 Redis 存儲 (List/Stream)
  • 異步:寫入 MQ 異步更新計數器、推送通知

社交動態評論系統,單表遞歸自關聯是經典最佳實踐。表少、查詢快、擴展強,遠優於業務維度建表。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
維度三表分離單表自關聯
擴展性固定 2 層無限層嵌套
查詢復雜度多 JOIN單表索引查詢
統計維護觸發器/多表更新單表計數器更新
數據一致性外鍵約束分散自關聯外鍵統一