選擇了一個適合我們的將樹結構存儲在關系型數(shù)據(jù)庫中的方案

關于樹結構的數(shù)據(jù),如何在關系型數(shù)據(jù)庫中表示,已經(jīng)成為了一個老生常談的問題.在這個項目中,我們也遇到了這個問題.

目前,業(yè)界中已經(jīng)給出了一些解決方案,最常見,最常用的是這三種:Parent-Child, Materialized Path, Nested Sets.其中,討論最多的,又是Nested Sets.

今天,在選擇方案的過程中,對這幾種方案,都做了一個詳細的比較,也針對我們的使用場景,做了一些假設.最終,選擇了第二種方式,即Materialized Path.

這幾種方案,其實都不完美.

我們的主要的使用場景,基本如下:

  • 查詢樹中全部的節(jié)點,并按其層次關系,組成一個JSON對象,返回給前臺
  • 分頁查詢,即查詢樹中一定數(shù)量的一級節(jié)點,以及這些一級節(jié)點的全部子節(jié)點
  • 增加一個葉子節(jié)點
  • 刪除一個節(jié)點,可能是葉子節(jié)點,也可能是非葉子節(jié)點
  • 修改一個節(jié)點的數(shù)據(jù)

我們的樹結構中的特點有:

  • 一級節(jié)點比較多,二級以后的節(jié)點應該就很少了

根據(jù)這個特色,我們設計主鍵字段的為36位的uuid,路徑字段的數(shù)據(jù)類型為TINYTEXT,因為TINYTEXT的長度為255 bytes,基本上能夠支持七層深度的樹.如果我們采用其他的數(shù)據(jù)類型,比如說,TEXT,其長度為65535 bytes,那可以支持更深的樹.

那我們的主鍵字段,為什么不采用可以AUTO_INCREMENT的int型呢?考慮到AUTO_INCREMENT是串行操作的,當同時有多個插入操作時,可能會存在性能上的問題.MySQL到底是怎么實現(xiàn)的,我也沒看過.但是我覺得在AUTO_INCREMENT這里,至少應該有一個鎖機制,來保證生成的id是連續(xù)并且唯一的.就算沒有,在計算機底層執(zhí)行主鍵id+1的操作時,也一定是串行的.而我們采用在代碼內自己生成UUID的方式,就可以避免這個約束.

我們之前在查找解決方案的時候,在對這三種方案的對比中,很多文章都使用的是最常規(guī)的樹的操作的例子.但是,由于我們對樹的操作有一些特殊性,比如,刪除一個節(jié)點,就連帶著刪除這個節(jié)點的子樹,使得使用Materialized Path這種方案,比較方便.其實Nested Sets這種方案,也是不錯的,但是實現(xiàn)起來比這個復雜一些,就沒有采用它.當然,還有其他的方案,比如使用專門的圖數(shù)據(jù)庫.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末耕姊,一起剝皮案震驚了整個濱河市桶唐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌箩做,老刑警劉巖莽红,帶你破解...
    沈念sama閱讀 211,948評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異邦邦,居然都是意外死亡安吁,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評論 3 385
  • 文/潘曉璐 我一進店門燃辖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鬼店,“玉大人,你說我怎么就攤上這事黔龟「局牵” “怎么了?”我有些...
    開封第一講書人閱讀 157,490評論 0 348
  • 文/不壞的土叔 我叫張陵氏身,是天一觀的道長巍棱。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,521評論 1 284
  • 正文 為了忘掉前任讶迁,我火速辦了婚禮上祈,結果婚禮上郁稍,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 65,627評論 6 386
  • 文/花漫 我一把揭開白布窝稿。 她就那樣靜靜地躺著,像睡著了一般凿掂。 火紅的嫁衣襯著肌膚如雪伴榔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,842評論 1 290
  • 那天,我揣著相機與錄音潮梯,去河邊找鬼骗灶。 笑死惨恭,一個胖子當著我的面吹牛秉馏,可吹牛的內容都是我干的。 我是一名探鬼主播脱羡,決...
    沈念sama閱讀 38,997評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼萝究,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了锉罐?” 一聲冷哼從身側響起帆竹,我...
    開封第一講書人閱讀 37,741評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎脓规,沒想到半個月后栽连,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,203評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡侨舆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,534評論 2 327
  • 正文 我和宋清朗相戀三年秒紧,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片挨下。...
    茶點故事閱讀 38,673評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡熔恢,死狀恐怖,靈堂內的尸體忽然破棺而出臭笆,到底是詐尸還是另有隱情叙淌,我是刑警寧澤,帶...
    沈念sama閱讀 34,339評論 4 330
  • 正文 年R本政府宣布愁铺,位于F島的核電站鹰霍,受9級特大地震影響,放射性物質發(fā)生泄漏茵乱。R本人自食惡果不足惜茂洒,卻給世界環(huán)境...
    茶點故事閱讀 39,955評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望似将。 院中可真熱鬧获黔,春花似錦、人聲如沸在验。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽腋舌。三九已至盏触,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背赞辩。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評論 1 266
  • 我被黑心中介騙來泰國打工雌芽, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人辨嗽。 一個月前我還...
    沈念sama閱讀 46,394評論 2 360
  • 正文 我出身青樓世落,卻偏偏與公主長得像,于是被迫代替她去往敵國和親糟需。 傳聞我的和親對象是個殘疾皇子屉佳,可洞房花燭夜當晚...
    茶點故事閱讀 43,562評論 2 349

推薦閱讀更多精彩內容