自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

聊聊樹狀結(jié)構(gòu)如何在數(shù)據(jù)庫中存儲

數(shù)據(jù)庫
昨天有人在QQ小組問起,無限分層的樹狀結(jié)構(gòu),數(shù)據(jù)量比較大,在一萬條以上,如何設(shè)計數(shù)據(jù)庫的結(jié)構(gòu)。其實這是個老生常談的問題,一般的做法是有一個 pid字段,為了提高效率,還會有個FullPath字段。

昨天有人在QQ小組問起,無限分層的樹狀結(jié)構(gòu),數(shù)據(jù)量比較大,在一萬條以上,如何設(shè)計數(shù)據(jù)庫的結(jié)構(gòu)。其實這是個老生常談的問題,一般的做法是有一個 pid字段,為了提高效率,還會有個FullPath字段。(一些人還設(shè)置一個層級字段,但我不知道這個字段有何作用),F(xiàn)ullPath字段可以用 id-id-id….這種方式拼字符串存儲,這樣可以方便地用 like 語句進(jìn)行查詢某個節(jié)點及其子節(jié)點。

曾經(jīng)看到過另外一種存儲方式,利用了一般樹結(jié)構(gòu)可以轉(zhuǎn)換二叉樹的這一做法,用二叉樹進(jìn)行存儲,在數(shù)據(jù)量大的情況下,存儲讀效率比上述的常見方案更優(yōu)些,所以特寫此文簡單介紹一番。

下圖說明了這種方案

如圖所示,在每個節(jié)點上,有l(wèi)eft ,right兩個字段,我們看到,圖上從根節(jié)點順著子節(jié)點開始畫一條線,每深入一層left加一,到底后,right=left+1,然后順著節(jié)點回溯,right逐級加一,一直回到根節(jié)點。

如果要查詢某個節(jié)點及其子節(jié)點,比如 fruit 節(jié)點 ,條件為 where left between 2 and 11

要查某個節(jié)點的full path ,比如 banana,條件為 where left<8 and right >9

如果要插入某個節(jié)點,比如red yellow直接插入一個節(jié)點,則update left =left+2 where left>=7 ,update right=right+2 where right>7,然后 新節(jié)點的left rigt分別是 7,8。 刪除節(jié)點類似。

這種方式,因為id都是int型數(shù)據(jù),加上索引后,讀的效率較高。而fullPath字段的方案查詢時候用的是字符串操作like,效率較低。

在內(nèi)存中,如果要還原樹狀結(jié)構(gòu),即在每個節(jié)點上增加pid屬性和children屬性,則稍微麻煩些,可以如下操作:

  1. 按left between x and y order by left 取數(shù)據(jù)
  2. 順序遍歷數(shù)據(jù),如果left=上一個Left+1,則是上一個節(jié)點的子節(jié)點,設(shè)置兩個對象的父子關(guān)系,如果發(fā)生跳號,則是上一個節(jié)點的兄弟節(jié)點。

OK,大致的方案就介紹到這里

原文鏈接:http://www.cnblogs.com/honghuamin/archive/2011/07/24/2115635.html

【編輯推薦】

  1. SQL Server如何動態(tài)生成分區(qū)腳本
  2. 手把手教你建立SQL數(shù)據(jù)庫的表分區(qū)
  3. 說說抽象SQL(參數(shù)化)的查詢
  4. 淺述遠(yuǎn)程Service Broker的實現(xiàn)
  5. 自己動手豐衣足食,DIY SQL字符串分解函數(shù)Split
責(zé)任編輯:艾婧 來源: 博客園
相關(guān)推薦

2018-01-26 13:28:48

數(shù)據(jù)庫數(shù)據(jù)重復(fù)數(shù)據(jù)庫清理

2024-05-26 10:29:29

2017-10-17 10:34:16

數(shù)據(jù)中心混合存儲

2009-10-27 16:36:07

Oracle如何解鎖

2009-06-01 09:57:43

netbeans連接數(shù)netbeans數(shù)據(jù)庫netbeans連接m

2011-05-25 13:37:15

數(shù)據(jù)庫

2021-03-01 10:20:52

存儲

2021-02-22 10:37:47

存儲Prometheus

2011-03-11 13:26:23

SQL Server數(shù)導(dǎo)入數(shù)據(jù)

2011-03-03 10:00:14

ProFTPD建立MySQL

2024-07-30 08:00:00

Kubernetes數(shù)據(jù)庫

2023-09-05 08:40:57

刪除數(shù)據(jù)庫Oracle

2018-04-12 11:20:16

MySQLmybatisJava

2010-10-09 10:29:29

MySQL外鍵

2017-09-26 13:35:40

Mysql數(shù)據(jù)庫設(shè)計樹狀數(shù)據(jù)

2023-07-26 15:52:05

2020-11-16 08:56:02

Python

2023-01-26 00:18:53

云原生數(shù)據(jù)庫云資源

2021-10-28 19:28:04

數(shù)據(jù)庫開發(fā)Spring

2023-01-06 08:31:53

數(shù)據(jù)庫基準(zhǔn)測試
點贊
收藏

51CTO技術(shù)棧公眾號