樹形數據是一種什麼體現,形式, 這裏先提前的展示一下,爲下面的postgresql操作樹形數據做一個鋪墊.
這樣的數據存儲在POSTGRESQL 的方式以及數據處理的方式,就是今天要討論和解決的問題.
上圖動用了一個新的字段類型ltree , ltree 本身就是使用樹形結構的來進行數據的存儲, 我們在輸入了數據後,就可以開始查詢了, 例如我們想知道當前樹形結構包含 A.B 的樹形路徑 通過 LTREE 自身的操作符號
以上邊語句作爲一個窗口對於表 path_tree 這個表對於 A.B 這個路徑以及包含這個路徑可以從輸入的數據看到, 2個路徑包含或等於 'A.B'
上面的圖形的意思是, 路徑中包含 A.E 和以上的路徑.
在大概瞭解了ltree 的操作後, 我們回到到底什麼是ltree ,ltree 到底可以做什麼.
在例如我們想知道通過A.E 節點的路徑有多少
select * from path_tree where path ~ 'A.E.*'
對於其他SQL常用的方式也都是支持和可以查詢的
目前PG12 支持的LTREE 類型是數字和字母, 並且小於256字節。
Ltree是一個PostgreSQL模塊。它實現了一個數據類型ltree,用於表示存儲在層次樹狀結構中的數據標籤。提供了通過標籤樹進行搜索的廣泛工具。通過點 . 的方式來將數據進行有效的分割,通過數據和點的組合將其變爲可組合的樹狀層次表達的一種方式。並且提供複雜的查詢表達方式,來提取數據的一種功能。
對於這種類型的數據,建立索引支持兩種類型,
1 B+
2 GIST
GIST 相對來說支持的操作符號會多一些,所以建議使用GIST來創建LTREE 類型數據的索引。
實際上這樣的數據類型還可以幫助我們來完成一些有趣的統計功能。如我們現在有從 A 到 M 的一串字母, 數字也可, 我們需要找到從A 或從任意字母開始到M字母或其他任意字母順序(必須順序並且不能大於挑選比任意字母順序位置前面或等於的位置的字母)路徑排序,以及有多少種可能。
先建立一個表
CREATE
TABLE
t_orga
(
parent_code text,
child_code text,
UNIQUE
(parent_code, child_code)
);
然後我們創建一個物化視圖,通過物化視圖遞歸來講上面的數據進行一個整合,因爲第一行有NULL 所以需要UNION ALL將NULL 和沒有NULL 的數據進行一個整合。
大家會注意到雖然上邊建表並未使用到LTREE 類型,但實際上在物化視圖中已經使用ltree 類型, 否則後面將無法通過LTREE 形式進行查詢。
同樣也可以對霧化視圖裏面的ltree 字段進行索引,提高數據查詢的效率