2014-02-24 37 views
0

在項目中,我的產品的位置,這可能是這樣的:如何存儲嵌套位置?

- Location 1 
-- SubLocation 1 
-- SubLocation 2 

- Location 2 
-- SubLocation 3 
-- SubLocation 4 

想象一個區域,在該子區域facilty。 我需要將其存儲在數據庫中,然後稍後再回來,如下所示:SubLocation 1 at Location 1

我的第一個猜測是有兩個表具有一對多ralationship,但不會縮放,所以後來我就需要有這樣的事情:

- Location 2 
    -- SubLocation 3 
    -- SubLocation 4 
    ---- SubLocation 5 
    ---- SubLocation 6 

所以我的問題是什麼是在關係數據庫中存儲這種結構的最佳方法是什麼?

回答

1

您可以將parent_id引用FK定義爲具有id的其他記錄(根值爲null parent_id)。

要定義分層並檢索一個查詢中的所有子樹,您可以定義一個額外的字段路徑(VARCHAR)。本場應該有「_」

分開你的情況SubLocation 5 IDS的完整路徑具有路徑=「2_4_5」

要檢索SubLocation 4所有的孩子都可以使用

select * 
from myTable 
where path like '2_4%'; 

有層次深度限制(實際上路徑的大小),但大多數情況下它應該可以工作。

1

在MySQL中處理分層數據很困難。因此,儘管您可能將數據存儲在遞歸表中,但查詢數據(通常)並不容易。如果你有一組固定的層次結構,比如三個(我在考慮「城市」,「國家」,「國家」),那麼你可以爲每個實體分別提供一個表格。這種方法很有效,在元素隨時間變化的情況下特別有用。

或者,您可以有一張平整尺寸的表格。所以,「城市」,「州」和「國家」都存儲在一行中。這使數據變平坦,所以它不再標準化。更新變得乏味。但是如果數據很少更新,那麼這不是問題。這種形式是一種「維度」形式,用於OLAP解決方案。

有混合的方法,您可以將每個元素以單一表格的形式存儲在遞歸表單中。但是,該表格還包含頂部的「完整路徑」。例如在你的最後一個例子中:

/location2/sublocation3 
/location2/sublocation4 
/location2/sublocation4/sublocation5 
/location2/sublocation4/sublocation6 

這有利於查詢數據。但它是以維護爲代價的。更改諸如sublocation4之類的內容需要更改許多行。想想觸發器。

最簡單的解決方案是爲不同的實體使用不同的表格(如果可以的話)。

0

您可以使用self join將它存儲在一個tabel和retreive sublocations中。