2010-07-09 65 views
16

我必須在數據庫中存儲樹,那麼執行此操作的最佳方法是什麼?顯示你使用的方法並命名它的優點和缺點。 (我正在使用SQL Server 2005)如何在SQL數據庫中存儲樹

回答

11

我發現SQL Anti-patterns中的討論非常有幫助,因爲它還關注每個實現的缺點。

此外,在this presentation的幻燈片48-77重申,analisys。

底線,沒有這樣的東西作爲一般的樹,沒有SQL樹的銀彈。 你將不得不問自己有關數據,他們將如何選擇,修改多少,分支機構會被移動等等,並根據這些答案實施合適的解決方案。

3

那麼,最簡​​單的方法是記錄有一個ParentID列,以便它知道哪個記錄是它的父項。這是一個非常標準的做法。例如,一家在線商店可能有一個產品類別的層次結構。每個類別都有一個ParentID。示例:服裝數據庫中的「牛仔褲」類別可能具有「褲子」作爲父類別。如果你想要一個記錄來表明哪些是它的孩子,那就更難了,除非你限制了孩子的數量。如果你想要一個二叉樹,你可以有LeftChildID和RightChildID列。如果您允許任意數量的孩子,您可以在兒童專欄中添加由逗號分隔的ID(例如1,4,72,19),但這會使查詢變得相當困難。如果數據庫允許在列中使用數組類型,則可以使用數組而不是分隔字符串,這很容易查詢 - 但我不確定MS SQL Server是否支持。

除此之外,它取決於您建模的數據類型以及您計劃對此樹執行的操作類型。

2

一般有兩種方法

  1. 在每一個記錄,存儲父的Id在一個空列(樹的根沒有父)
  2. 使用喬·塞科的嵌套集模型的技術說明here和 (感謝來自@onedaywhen評論),也什麼是原始的源here

編輯:這種材料的新鏈接here

優點和缺點?? !你在開玩笑,對吧 ?!

+0

Celko將嵌套集模型歸屬於Michael Kamfonas,儘管Celko似乎已經創造了這個短語並且肯定會拋光並且推廣這項技術。 – onedaywhen 2010-07-09 14:05:16

+0

+1 - 幾周前我剛剛使用了Celko的文章,這非常有幫助。 – 2010-07-09 15:43:55

+0

此答案中的鏈接現在不幸中斷。有人知道還有什麼地方可以找到這些信息嗎? – Qqwy 2017-04-17 10:17:11

1

我在過去通過在SQL中將數據存儲爲xml來完成此操作。