2012-03-09 126 views
0

我無法實現規範化的關係數據庫設計來描述一個與典型層次結構示例有足夠偏差的小型層次結構,因此我不確定如何進行第一次處理此類問題。數據庫設計:分層數據

我的問題如下:

層次中的每個分支被保證是2,4,或6級深。 如果是2級深,層次結構如下所示:

Category/Group/Component 

如果是4級深,它看起來像這樣:

Category/Group/Component/Group/Component 

如果是6層深,它看起來像這個:

Category/Group/Component/Group/Component/Group/Component 

分類,組和組件都有自己的一組屬性。更復雜的是,組件和實體A,組件和實體B以及組件和實體C之間存在關係。我最初的想法是努力將組件保留在一張表中,但是,我有無法提出滿足此目標的標準化解決方案。

取而代之,我想出了一個規範化的解決方案,其中在三個可能的組件級別中的每一個都有一個單獨的表格。然而,我並不十分理解這個問題,因爲它將捕獲組件和實體A,B和C之間鏈接的表的數量增加了三倍(如果所有組件都在一個表中,則爲9個總鏈接表而不是3個)。

以下是設計我想出了模樣:

TABLE: Group_1_Components 

ATTRIBUTES: Row_ID, Category, Component 

RELATES-TO: Group_1_Components_A_Links, Group_1_Components_B_Links, Group_1_Components_C_Links, Group_2_Components 

TABLE: Group_2_Components 

ATTRIBUTES: Row_ID, Group, Component, Group_1_Component_Row_ID 

RELATES-TO: Group_2_Components_A_Links, Group_2_Components_B_Links, Group_2_Components_C_Links, Group_1_Components, Group_3_Components 

TABLE: Group_3_Components 

ATTRIBUTES: Row_ID, Group, Component, Group_2_Component_Row_ID 

RELATES-TO: Group_3_Components_A_Links, Group_3_Components_B_Links, Group_3_Components_C_Links, Group_2_Components 

每個環節9表包含兩個ID來解決多對一的與表A,B或C之間存在多對多關係。

Is th是一個合理的設計,還是我忽略了一個更簡單,更典型的解決方案?我研究了一些專門用於在關係數據庫中捕獲層次結構的設計技術,特別是鄰接列表,但我不確定它們是否適合這裏,也不是標準化的解決方案。

應該指出,層次結構將很少修改;它經常被讀取的地方讀取檢索選定組的特定級別的所有組件或組件。實體A,B和C的鏈接表將定期寫入。

歡迎任何和所有建議。在此先感謝您的幫助。 Brian

回答

1

我建議您對數據進行反規範化處理,以便您的層次結構基於組件/組實體,以便匹配「常規」層次結構。在這種情況下,你可以有以下表格:

一)組件

B)組

C)Component_Groups - 與COMPONENT_ID和GROUP_ID的唯一密鑰,以確保您只有一個組合,每個組件和組

在這種情況下,那麼你的層次結構將是:分類 - > Component_Group - > Component_Group - > Component_Group

0

對於這類問題的另一種選擇是使用自引用表。只有一張桌子。

帶有ID,PARENT_ID和TYPE的單個表格,因此您可以區分CATEGORY,GROUP和COMPONENT。

所有類別都不會有PARENT_ID,然後您可以搜索所有父級ID與您想深入分類的ID相同的子級對象。