2016-10-10 14 views
1

我想創建像這樣的深度未知的分層數據:如何爲未知深度的分層數據設計數據庫表?

創建類別和子類別以及這些子類別他們也有子類別等等。

子類別的深度是未知的,只會在用戶運行時完成。

我雖然約是,但他們都在一個表中,有一個父列拿着父類的ID是這樣的:

enter image description here

我不知道這是否是正確的這樣做的方式,但我看不到任何其他方式。

我已經做了一個快速搜索,我發現與DB表設計沒有直接關係。

我使用MS SQL Server 2012的

+0

這似乎是問題的一個不同凡響。有沒有問題可以用這種設計來回答?怎麼樣維護數據? –

+0

您可能會閱讀[HIERARCHYID](https://msdn.microsoft.com/en-us/library/bb677290.aspx)。通常情況下,您應將所有行存儲在一個表中並回到父級。這樣的結構是非常笨拙的... – Shnugo

+0

@Shnugo意味着加入回我的問題中提到的相同嗎? –

回答

2

有3種常見的方法來處理這種不常見的問題。

1鄰接表(你的方法) 臨 -易懂,快速插入任何地方 CON - 未知深度的慢查詢樹遞歸

2.嵌套集合 親 -快速查詢 騙局 -插入中間名單很慢

3.路徑 - 像HIERARCHYID(基本上是一個二進制的路徑) 臨 -快速 CON -像HIERARCHYID通常有限制的長度 - 我認爲HIERARCHYID大約是892字節最大

4。 Closure表 Pro -最佳嵌套集&鄰接列表。快速插入&選擇。 CON -有點難以在第一,但值得努力圍繞讓你的頭,如果性能是一個問題

來源:SQL反模式 - 比爾Karwin

0

最廣泛使用的設計模式爲represnting在表層次結構被稱爲「鄰接表」。這是你在問題中提出的模式。

另一種方法稱爲「嵌套集」。下面是對嵌套集的簡單描述:https://en.wikipedia.org/wiki/Nested_set_model

如果你查看鄰接列表vs嵌套集,你會得到很多文章討論兩者之間的權衡。

基本上,鄰接列表很容易更新,但很難使用,除了最基本的操作。嵌套Set很難更新,但易於使用。像從根中找到路徑一樣的操作,找到子樹是非常明智的,並且很好理解。