BBS 樹狀回覆結構常用遞迴查詢,但頻繁 SQL 查詢效能差。儲存程序雖能減少網路往返,但根本解決需更佳演算法。
新增三個備用欄位:
rootid:根文章 ID (0 表示根)deep:回覆深度 (0=根文章)ordernum (FLOAT):排序基數,**關鍵欄位**ordernum = 0 (建議用 2 的冪次如 65536 為起始基數)| 步驟 | 動作 | ordernum 計算 | 排序結果 |
|---|---|---|---|
| 1 | 根文章 ID=1 | 0 | 1(0) |
| 2 | 回覆根文章 ID=2 | 64 | 1(0), 2(64) |
| 3 | 回覆根文章 ID=3 | (0+64)/2=32 | 1(0), 3(32), 2(64) |
| 4 | 回覆 ID=3 的文章 ID=4 | (32+64)/2=48 | 1(0), 3(32), 4(48), 2(64) |
| 5 | 回覆 ID=4 的文章 ID=5 | (48+64)/2=56 | 1(0), 3(32), 4(48), 5(56), 2(64) |
| 6 | 回覆 ID=3 的另一篇 ID=6 | (32+48)/2=40 | 1(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 取得更高精度