在關系數據庫中存儲分層數據有哪些選項?好的概述一般來說,您要在快速讀取時間(例如,嵌套集)或快速寫入時間(鄰接列表)之間做出決定。通常,您最終會得到最適合您需求的以下選項組合。以下提供了一些深入閱讀:還有一個嵌套間隔與鄰接列表比較:我發現的鄰接列表,物化路徑,嵌套集和嵌套間隔的最佳比較。分層數據的模型:幻燈片,有很好的權衡解釋和示例用法在MySQL中表示層次結構:特別是對嵌套集的非常好的概述RDBMS中的分層數據:我見過的最全面,組織良好的鏈接集,但解釋方式不多選項我知道和一般的功能:鄰接清單:列:ID,ParentID易于實施。便宜節點移動,插入和刪除。昂貴的找到水平,血統和后代,路徑在支持它們的數據庫中通過公用表表達式避免使用N + 1嵌套集(又名修改的預訂樹遍歷)列:左,右便宜的血統,后代非常昂貴的O(n/2)移動,插入,由于易失性編碼而刪除橋表(又名閉包表/ w觸發器)使用單獨的連接表:祖先,后代,深度(可選)廉價的血統和后代寫入O(log n)插入,更新,刪除的成本(子樹的大?。┮幏痘幋a:適用于連接中的RDBMS統計信息和查詢規劃器每個節點需要多行譜系列(又名物化路徑,路徑枚舉)專欄:血統(例如/父母/孩子/孫子/等......)廉價后代通過前綴查詢(例如LEFT(lineage, #) = '/enumerated/path')寫入O(log n)插入,更新,刪除的成本(子樹的大小)非關系型:依賴于Array數據類型或序列化字符串格式嵌套間隔像嵌套集一樣,但是使用實數/浮點數/小數,這樣編碼就不易變(廉價的移動/插入/刪除)有實/浮/十進制表示/精度問題矩陣編碼變體為“自由”添加了祖先編碼(物化路徑),但增加了線性代數的詭計。平表修改的Adjacency List,為每條記錄添加Level和Rank(例如排序)列。便宜迭代/分頁昂貴的移動和刪除好用:線程討論 - 論壇/博客評論多個譜系列列:每個譜系級別一個,指向根目錄的所有父級,從項目級別向下的級別設置為NULL便宜的祖先,后代,水平便宜的插入,刪除,移動的葉子昂貴的插入,刪除,移動內部節點對層次結構有多深的硬性限制數據庫特定說明MySQL的將會話變量用于Adjacency List神諭使用CONNECT BY遍歷鄰接列表PostgreSQL的物化路徑的ltree數據類型SQL Server總結2008年提供的HierarchyId數據類型似乎有助于Lineage Column方法并擴展可以表示的深度。
3 回答

神不在的星期二
TA貢獻1963條經驗 獲得超6個贊
這是對你的問題的非常局部的答案,但我希望仍然有用。
Microsoft SQL Server 2008實現了兩個對管理分層數據非常有用的功能:
所述HierarchyId的數據類型。
公用表表達式,使用with關鍵字。
看一看“的模式您的數據層次結構有了SQL Server 2008”由Kent Tegels MSDN上的開始。另請參閱我自己的問題:SQL Server 2008中的遞歸同表查詢
添加回答
舉報
0/150
提交
取消