2009-06-01 153 views
125

在數據庫中實現可定製(意思是具有未知數目的層次的樹結構)樹數據結構的最佳方式是什麼?樹數據結構的數據庫結構

我在使用一個帶有外鍵的表之前完成了這一次。

你能看到什麼其他的實現,這個實現是否有意義?

+3

請參見:[在關係數據庫中存儲分層數據的選項是什麼?](http://stackoverflow.com/questions/4048151/what-are-the-options-for-storing-hierarchical-data-in - 關係數據庫) – cbare 2012-12-18 15:14:38

+0

SQL Server(自2008年以來)提供[hierarchyid數據類型](https://msdn.microsoft.com/en-us/library/bb677290.aspx) – BornToCode 2015-06-16 08:39:55

回答

63

你提到的最常見的實現,這是鄰接表: https://blogs.msdn.microsoft.com/mvpawardprogram/2012/06/25/hierarchies-convert-adjacency-list-to-nested-sets

還有其他車型,以及包括物化路徑和嵌套集合: http://communities.bmc.com/communities/docs/DOC-9902

喬·塞科已經對這個寫了一本書主題,這是從一般SQL角度的一個很好的參考(它在上面的嵌套文章鏈接中提到)。

此外,伊茨克奔江恩在他的著作「內部的Microsoft SQL Server 2005:T-SQL查詢」最常用的選項很好的概述。

選擇模型時要考慮的主要事情是:結構變化的

1)頻率 - 頻率如何樹變化的實際結構。某些型號提供更好的結構更新特性。但是,將結構更改與其他數據更改分開很重要。例如,您可能想要模擬公司的組織結構圖。有些人會將此模型作爲鄰接列表進行建模,使用員工ID將員工鏈接到其主管。這通常是次優方法。通常更好的方法是將組織結構建模與員工本身分開,並將員工作爲結構的一個屬性進行維護。這樣,當員工離開公司時,組織結構本身不需要改變,只需要與離開的員工建立聯繫。

2)是樹大量寫入或讀重 - 一些結構工作得很好閱讀結構的時候,但需要支付額外的開銷寫入結構時。

3)什麼類型的信息,你需要從結構來獲得 - 一些結構擅長提供某些種類的有關結構的信息。例子包括查找節點及其所有子節點,查找節點及其所有父節點,查找滿足特定條件的子節點的數量等。您需要知道結構需要哪些信息來確定最適合您需求的結構。

48

看看Managing Hierarchical Data in MySQL。它討論了在關係數據庫中存儲和管理分層(樹狀)數據的兩種方法。

第一種方法是鄰接列表模型,這就是您基本描述的:擁有引用表本身的外鍵。雖然這種方法很簡單,但對於某些查詢(如構建整棵樹)可能效率很低。

本文討論的第二種方法是嵌套集模型。這種方法更加高效和靈活。有關詳細說明和示例查詢,請參閱文章。

+0

您的鏈接有一個非常有趣的主題正在討論。謝謝! – Fritz 2015-08-26 13:41:47

2

擁有一個帶有外鍵的表對我來說確實有意義。

然後,您可以使用SQL中的公用表表達式或通過Oracle中的先前語句連接來構建樹。

+0

我有一個日誌表,一個LogID標識列,一個ParentLogID列和一個FK指向LogID列。當寫入事務中的第一個日誌行時,我抓取SCOPE_IDENTITY()。所有其他日誌記錄都使用ParentLogID列中的該值編寫。這對分組屬於同一行的行非常有用。這是看到發生的事情的唯一真正方法,如果沒有這些,這將是來自多個事務的日誌行混雜在一起的巨大混亂。 – 2009-06-01 15:22:15

1

我用下面的實現對SQL Server 2005的 檢查here

8

如果你必須使用關係數據庫來組織樹數據結構,那麼PostgreSQL有清涼ltree模塊,用於表示存儲在分層樹形結構數據的標籤提供的數據類型。 (更多信息請參見:http://www.postgresql.org/docs/9.0/static/ltree.html

常見的LDAP用於組織層次結構中的記錄。