2011-02-15 45 views
1

我有一個模型問題,隨後在單獨的SO帖子中查看問題,我將在創建它時鏈接到該問題。我做了兩個帖子,所以我可以做兩個接受。作爲一個單一的非規範化視圖,以多對多或另一種方式來表示一個多人和一個人?

現在,讓我們開始假設我有以下模式。這是我設計的真正模式的簡化版本,省略了不相關的列。名字已經改變,以保護無辜者和我的工作。

tree具有以下屬性。

tree.id 
tree.dob 
tree.height  
tree.forestid 

forestid是一個外鍵forest表,這就是匯聚多個tree行的方式。它有一個id列和一些元數據列。

treeforest都有潛在的許多treedata行。 treedata包含

treedata.value 
treedata.treeid 
treedata.forestid 

treedata.treeid和treedata.forestid的約束,使得這兩個中的一個必須是空的。

如果tree.forestid不爲null,則treedata和tree之間的關係是多對多的,而forest是鏈接器表。否則,樹和treedata之間的關係是一對多的。對於我的應用程序來說非常重要的是,用戶能夠通過UI將樹一起分組到林中,併爲整個森林設置treedata.value,但也能夠處理單個樹。現在,我可以想到幾種方法來表示這一點。一個是說每棵樹都有一個前庭,並且是一個至少有1個大小的森林。然後,這個關係總是多到很多。另一種方法是提供沿

select tree.*, treedata.* 
from tree, treedata 
where tree.id = treedata.treeid 
union 
select tree.*, treedata.*, 
from tree, treedata 
where tree.forestid = treedata.forestid. 

行一個規格化視圖還有第三種方法是在tree具有forestid柱和完全刪除forest表。在這條路上,我看到難以獲得關於tree.forestid正確遞增的ACID保證。森林還應該包含自己的元數據。我很樂意聽到更多的方式來表達這一點,也希望得到更多經驗豐富的數據庫人員關於哪種方式更可取的觀點,以及如果通過引用來自您自己的經驗的例子解釋您爲什麼這麼認爲,那麼頂級標記。

響應TreeComposite表的馬丁大教堂的建議:

感謝您的答覆。我想在迴應之前提供一個TreeComposite的建議來煨。首先,你的方式確實模仿了我以正常形式表達的關係,所以是的,我認爲你確實理解了這個問題。然而,我認爲我通過命名我的表樹和森林犯了一個愚蠢的錯誤:因爲森林不需要遞歸地組合到對方中。它們不是計算機科學樹。它們只是樹皮和樹枝樹。雖然它仍然代表了我在正常形式中需要的東西(這是對我所需要的東西的概括),儘管它具有樹木和森林現在是「同一件事物」的優點,但表面上複雜的勝利,我擔心在土壤中它會混亂。

問題是,無論它們在我的模型中是否被稱爲相同的東西,它們與我的控制器或視圖不是同一回事。例如。,具有子節點的TreeComposite可能至少具有每個節點將具有不同值的屬性。在這種情況下,我需要在視圖中使用不同的小部件來顯示屬性的多個值。換一種說法,我需要能夠將每個TreeComposite作爲其自己的父級顯示爲單行,並且該行的外觀取決於TreeComposite是否具有子級。

因此,從我的模型中提取TreeComposite後,我必須做的第一件事是決定它是「真的」一棵樹還是一棵森林。爲什麼這樣,當我可以直接以樹和森林的形式以正常形式存儲它時,從而使我的視圖和控制器更簡單而不會傷害我的模型?搜索TreeData也因父子關係而變得複雜。我必須通過N個TreeComposites連接,直到找到根節點,然後搜索指向根節點的TreeData。這使數據局部化。同時,如果我有一棵帶有ForestID的樹,並且我想要這棵樹的數據,我根本不需要看森林表。我可以做一個直接外鍵< - >外鍵加入TreeData。 (where Tree.ForestID = TreeData.ForestID)。

回答

2

複合類結構如何?假設您有表TreeComposite,它具有指向另一個TreeComposite的TreeComposite.ParentId外鍵。一個TreeData只能引用一個TreeComposite,所以它只能引用一個森林或一棵樹的約束被保留下來。

我看到的唯一問題是,您可能有多個層次的組合,根據您嘗試解決的問題,這可能或可能沒有意義。

如果我正確地理解了你的約束條件,那麼TreeComposite和TreeData之間的關係可以通過中間表進行多對多的處理。

使用此模型,您可以將樹和森林視爲同一種對象,並在考慮到這一點的同時應用元數據。

相關問題