2013-08-07 113 views
2

我需要在我的數據庫中表示地理對象的層次結構。每個對象都有一個名稱和地理座標(緯度/經度)。如何在SQL數據庫中表示層次結構

第一級層次的可能有兩種可能值之一:海洋 | Terrastiaral

第2級(對於海洋)可能是Seas |裏弗斯。 第三級(對於海洋)包括所有可能的海名(例如波羅的海)。

此外,在3級我可能要鏈路的每個海/河與大海它涉及到所有裏弗斯應該與一些它涉及到額外的聯繫。 還有第四,第五和第六級別的對象是較小的類型。

重要提示: [3,4,5,6]級別的任意組合可以跳過這種類型的層次結構,也就是說我們可以有層次(1,2,3,4,5)或(1, 2,3)或(1,2,3,5)。

此外,我將在我的應用程序中使用sqlalchemy ORM作爲對象表示。

我應該爲父節點使用不同層次結構的外鍵使用不同的表嗎? 對於跳過的層次,我們可以爲每個層次結構路徑使用虛擬節點。

我應該爲所有節點製作一個統一的表格,並將其級別存儲爲整數值,父級的FK(即鄰接列表結構)?

每種方法的優缺點是什麼?

誰有其他想法(考慮到所有約束)?

+0

您是否希望在層次結構中存儲關於每個級別的不同內容,或者只是名稱和lat/long? –

回答

0

的最佳表設計我能想到的是如下

table hirarchy 

columns : hirarchyid | hirarchylevel 



table hirarchy_possible_values 

columns : possiblevalueid | possiblevalue | hirarchyid 



table geo_object 

columns : objectid | objectName| latitude | longitude | hirarchyid | possiblevalueid 
+0

如何在建議的數據庫模式中建立父子關係? 另外,你能解釋一下'hirarchy_possible_values'是什麼? – leavittx

1

這取決於你打算用數據做什麼。您的特殊表格方法適用於特定類型的用途。

如果你使用統一的表格,你可以採取兩種方法。第一個是鄰接列表模型。關係模式中的鄰接列表模型看起來與它在對象世界中的不一樣。 Brief Article

第二個是嵌套集合模型。 Wikipedia Article第一個更容易更新,而第二個更容易用於複雜查詢,比如查找給定的子樹。