回答
你提到的最常見的實現,這是鄰接表: 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)什麼類型的信息,你需要從結構來獲得 - 一些結構擅長提供某些種類的有關結構的信息。例子包括查找節點及其所有子節點,查找節點及其所有父節點,查找滿足特定條件的子節點的數量等。您需要知道結構需要哪些信息來確定最適合您需求的結構。
看看Managing Hierarchical Data in MySQL。它討論了在關係數據庫中存儲和管理分層(樹狀)數據的兩種方法。
第一種方法是鄰接列表模型,這就是您基本描述的:擁有引用表本身的外鍵。雖然這種方法很簡單,但對於某些查詢(如構建整棵樹)可能效率很低。
本文討論的第二種方法是嵌套集模型。這種方法更加高效和靈活。有關詳細說明和示例查詢,請參閱文章。
您的鏈接有一個非常有趣的主題正在討論。謝謝! – Fritz 2015-08-26 13:41:47
擁有一個帶有外鍵的表對我來說確實有意義。
然後,您可以使用SQL中的公用表表達式或通過Oracle中的先前語句連接來構建樹。
我有一個日誌表,一個LogID標識列,一個ParentLogID列和一個FK指向LogID列。當寫入事務中的第一個日誌行時,我抓取SCOPE_IDENTITY()。所有其他日誌記錄都使用ParentLogID列中的該值編寫。這對分組屬於同一行的行非常有用。這是看到發生的事情的唯一真正方法,如果沒有這些,這將是來自多個事務的日誌行混雜在一起的巨大混亂。 – 2009-06-01 15:22:15
我用下面的實現對SQL Server 2005的 檢查here
的準備意想不到收集使用可以與鄰接列表模型可以用來讓生活更簡單的功能。
http://www.artfulsoftware.com/mysqlbook/sampler/mysqled1ch20.html
如果你必須使用關係數據庫來組織樹數據結構,那麼PostgreSQL有清涼ltree模塊,用於表示存儲在分層樹形結構數據的標籤提供的數據類型。 (更多信息請參見:http://www.postgresql.org/docs/9.0/static/ltree.html)
常見的LDAP用於組織層次結構中的記錄。
- 1. 在數據庫結構與節點的樹狀數據結構
- 2. 樹數據結構
- 3. 樹的數據結構
- 4. 生成樹狀結構的數據庫
- 5. 數據庫結構
- 6. 數據庫結構
- 7. 結構java樹型數據
- 8. iPhone樹型數據結構
- 9. Rails 3樹數據結構
- 10. 二叉樹數據結構
- 11. 樹像數據結構
- 12. N'Ary樹數據結構
- 13. 存儲樹數據結構
- 14. 樹數據結構addnode
- 15. 數據結構樹複雜
- 16. 「排序」樹數據結構
- 17. Postgresql樹數據結構
- 18. 路徑數據像數據結構樹
- 19. 樹數據結構和數據
- 20. CMS的數據庫結構
- 21. 數據庫結構關係數據庫
- 22. 數據庫數據庫結構
- 23. 樹狀結構化數據的分佈式數據庫?
- 24. 深層數據樹的高效數據庫結構
- 25. 存儲數據庫結構
- 26. 數據庫結構錯誤
- 27. 組織數據庫結構
- 28. 模擬數據庫結構
- 29. Zend_Auth:數據庫表結構
- 30. Yii數據庫結構
請參見:[在關係數據庫中存儲分層數據的選項是什麼?](http://stackoverflow.com/questions/4048151/what-are-the-options-for-storing-hierarchical-data-in - 關係數據庫) – cbare 2012-12-18 15:14:38
SQL Server(自2008年以來)提供[hierarchyid數據類型](https://msdn.microsoft.com/en-us/library/bb677290.aspx) – BornToCode 2015-06-16 08:39:55