首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

中值排序基數法實作樹狀結構:遞迴替代方案與 BBS 回覆排序實戰

     編輯:關於SqlServer

問題背景

BBS 樹狀回覆結構常用遞迴查詢,但頻繁 SQL 查詢效能差。儲存程序雖能減少網路往返,但根本解決需更佳演算法。

核心思想:中值排序基數法

新增三個備用欄位:

  • rootid:根文章 ID (0 表示根)
  • deep:回覆深度 (0=根文章)
  • ordernum (FLOAT):排序基數,**關鍵欄位**

演算法規則

  1. 根文章 ordernum = 0 (建議用 2 的冪次如 65536 為起始基數)
  2. 直接回覆根文章:取根與現有第一則回覆的中值
  3. 回覆第 N 層文章:取該文章與其同層下一篇的中值
  4. 若無下一篇,取該文章與上一層文章的中值

實戰推演 (起始基數 64 為例)

步驟動作ordernum 計算排序結果
1根文章 ID=101(0)
2回覆根文章 ID=2641(0), 2(64)
3回覆根文章 ID=3(0+64)/2=321(0), 3(32), 2(64)
4回覆 ID=3 的文章 ID=4(32+64)/2=481(0), 3(32), 4(48), 2(64)
5回覆 ID=4 的文章 ID=5(48+64)/2=561(0), 3(32), 4(48), 5(56), 2(64)
6回覆 ID=3 的另一篇 ID=6(32+48)/2=401(0), 3(32), 6(40), 4(48), 5(56), 2(64)

優缺點分析

優點缺點
單次 INSERT 即可維持正確順序,無需重排極深層級回覆可能導致浮點精度耗盡 (基數間距過小)
查詢極簡單:ORDER BY ordernum 即得完整樹狀序大量移動/刪除節點時需重新計算基數
支援無限層級巢狀需預留足夠大的初始基數空間 (建議 2^16 或 2^32)

實務建議

  • 起始基數使用 POWER(2, 32) 或更大,延長精度壽命
  • 定期執行「基數重整」作業:依現有順序重新分配等距基數
  • 搭配 deep 欄位可快速篩選特定層級回覆
  • 考慮使用 DECIMAL(38, 20) 替代 FLOAT 取得更高精度
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved