POSTGRESQL怎么存儲樹形數(shù)據(jù)和處理樹形數(shù)據(jù)
小編給大家分享一下POSTGRESQL怎么存儲樹形數(shù)據(jù)和處理樹形數(shù)據(jù),希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!
樹形數(shù)據(jù)是一種什么體現(xiàn),形式, 這里先提前的展示一下,為下面的postgresql操作樹形數(shù)據(jù)做一個鋪墊.
這樣的數(shù)據(jù)存儲在POSTGRESQL 的方式以及數(shù)據(jù)處理的方式,就是今天要討論和解決的問題.
上圖動用了一個新的字段類型ltree , ltree 本身就是使用樹形結(jié)構(gòu)的來進(jìn)行數(shù)據(jù)的存儲, 我們在輸入了數(shù)據(jù)后,就可以開始查詢了, 例如我們想知道當(dāng)前樹形結(jié)構(gòu)包含 A.B 的樹形路徑 通過 LTREE 自身的操作符號
以上邊語句作為一個窗口對于表 path_tree 這個表對于 A.B 這個路徑以及包含這個路徑可以從輸入的數(shù)據(jù)看到, 2個路徑包含或等于 'A.B'
上面的圖形的意思是, 路徑中包含 A.E 和以上的路徑.
在大概了解了ltree 的操作后, 我們回到到底什么是ltree ,ltree 到底可以做什么.
在例如我們想知道通過A.E 節(jié)點的路徑有多少
select * from path_tree where path ~ 'A.E.*'
對于其他SQL常用的方式也都是支持和可以查詢的
目前PG12 支持的LTREE 類型是數(shù)字和字母, 并且小于256字節(jié)。
Ltree是一個PostgreSQL模塊。它實現(xiàn)了一個數(shù)據(jù)類型ltree,用于表示存儲在層次樹狀結(jié)構(gòu)中的數(shù)據(jù)標(biāo)簽。提供了通過標(biāo)簽樹進(jìn)行搜索的廣泛工具。通過點 . 的方式來將數(shù)據(jù)進(jìn)行有效的分割,通過數(shù)據(jù)和點的組合將其變?yōu)榭山M合的樹狀層次表達(dá)的一種方式。并且提供復(fù)雜的查詢表達(dá)方式,來提取數(shù)據(jù)的一種功能。
對于這種類型的數(shù)據(jù),建立索引支持兩種類型,
1 B+
2 GIST
GIST 相對來說支持的操作符號會多一些,所以建議使用GIST來創(chuàng)建LTREE 類型數(shù)據(jù)的索引。
實際上這樣的數(shù)據(jù)類型還可以幫助我們來完成一些有趣的統(tǒng)計功能。如我們現(xiàn)在有從 A 到 M 的一串字母, 數(shù)字也可, 我們需要找到從A 或從任意字母開始到M字母或其他任意字母順序(必須順序并且不能大于挑選比任意字母順序位置前面或等于的位置的字母)路徑排序,以及有多少種可能。
先建立一個表
CREATE
TABLE
t_orga
(
parent_code text,
child_code text,
UNIQUE
(parent_code, child_code)
);
然后我們創(chuàng)建一個物化視圖,通過物化視圖遞歸來講上面的數(shù)據(jù)進(jìn)行一個整合,因為第一行有NULL 所以需要UNION ALL將NULL 和沒有NULL 的數(shù)據(jù)進(jìn)行一個整合。
大家會注意到雖然上邊建表并未使用到LTREE 類型,但實際上在物化視圖中已經(jīng)使用ltree 類型, 否則后面將無法通過LTREE 形式進(jìn)行查詢。
同樣也可以對霧化視圖里面的ltree 字段進(jìn)行索引,提高數(shù)據(jù)查詢的效率
看完了這篇文章,相信你對“POSTGRESQL怎么存儲樹形數(shù)據(jù)和處理樹形數(shù)據(jù)”有了一定的了解,如果想了解更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!