2009-05-27 127 views
11

我有一個產品目錄。每個類別由不同數量(深度)的子類別組成。關卡的數量(深度)是未知的,但我相信它不會超過5,6個關卡。讀取數據時的數據更改很少。分層數據模型:鄰接列表與嵌套集合

問題是:什麼類型的分層數據模型更適合這種情況。該項目基於Django框架,應該考慮它的特性(管理i-face,模型處理...)。

非常感謝!

回答

4

Nested sets如果不需要頻繁更新或分層排序,性能會更好。

如果您需要樹更新或分級排序,最好使用parent-child數據模型。

它很容易構建在OracleSQL Server 2005+,並不容易(但仍有可能)在MySQL

4

我會使用修改的預置樹遍歷算法MPTT來處理這種分層數據。如果你不介意對結構進行修改會帶來一點負擔,這樣可以在穿越樹木和尋找孩子時獲得很好的表現。

幸運的是,Django有一個很棒的圖書館,django-mptt。我在很多成功的項目中都使用過它。還有django-treebeard,它提供了幾種替代算法,但我沒有使用它(它似乎不像mptt那樣受歡迎)。

+4

注:MPTT和 「嵌套集合」 是同一個概念的不同名稱。 – jwfearn 2010-11-04 22:02:07

4

根據這些文章:

http://explainextended.com/2009/09/24/adjacency-list-vs-nested-sets-postgresql/ http://explainextended.com/2009/09/29/adjacency-list-vs-nested-sets-mysql/

「MySQL是四大(MySQL和甲骨文,SQL服務器,PostgreSQL的),對於該嵌套組的唯一系統模型顯示體面的表現,可以考慮存儲分層數據。「

+1

天哪......比較什麼?我發現Nested Sets幾乎可以打敗競爭對手。 Oracle的CONNECT BY的功能是例外。 – 2012-10-11 04:46:23

0

鄰接表更容易維護,而嵌套集的查詢速度要快得多。

問題一直是,將鄰接列表轉換爲嵌套集合已經讓位很長時間,這要歸功於一個真正令人討厭的「推棧」方法,它裝載了RBAR。所以人們最終會在嵌套集中做一些非常困難的維護或者不使用它們。

現在,你可以吃你的蛋糕,吃它!您可以在不到一秒的時間內在不到4秒的時間內完成100,000個節點上的轉換,並在一百萬行上完成轉換!順便說一下,所有在T-SQL!請參閱以下文章。

Hierarchies on Steroids #1: Convert an Adjacency List to Nested Sets

Hierarchies on Steroids #2: A Replacement for Nested Sets Calculations