使用閉包表如何高效地模糊查詢樹狀結構數(shù)據(jù)?

使用閉包表如何高效地模糊查詢樹狀結構數(shù)據(jù)?

使用閉包表查詢樹狀結構數(shù)據(jù)

問題:

需要根據(jù)樹狀表結構模糊查詢數(shù)據(jù),保留符合條件的層級,例如:有表字段為 id、parent_id 和 name,想要根據(jù) name 模糊查詢出 “%肉%” 相關的層級,并只顯示查詢結果的相關層級。

解決方案:

建議使用閉包表來解決此問題。創(chuàng)建一個名為 tree 的表,它包含以下列:

  • self:當前節(jié)點的 id。
  • parent:當前節(jié)點的父節(jié)點 id。
  • distance:當前節(jié)點到根節(jié)點的距離。

通過這種方式,你可以將樹以閉包的形式存儲在表中。

步驟:

  1. 生成閉包表:
create table tree(self int, parent int, distance int);
  1. 將樹狀數(shù)據(jù)插入閉包表中:

你可以通過遍歷樹結構逐行插入數(shù)據(jù)。

  1. 根據(jù)條件查詢數(shù)據(jù):
select * from tree where self like '%肉%';
  1. 在代碼中按 self 分類并合并樹:
from itertools import groupby  root = {}  for _, path in groupby(from_datebase, key=lambda x: x[0]):     path = sorted(list(path), key=lambda x: -x[2])     node = root     for _, nodeName, _ in path:         node = node.setdefault(nodeName, {})

其他注意事項:

  • 在實際使用中,不要直接映射中文,應該為每個分類分配一個 id。
  • 閉包表的存儲空間會隨著樹的層級深度成倍增加,但在大多數(shù)情況下這并不會影響性能。
  • 插入、更新和刪除等操作都需要重寫,工作量較大,但這種方法是一種相對規(guī)范的做法。

? 版權聲明
THE END
喜歡就支持一下吧
點贊10 分享