我有一個模型問題,隨後在單獨的SO帖子中查看問題,我將在創建它時鏈接到該問題。我做了兩個帖子,所以我可以做兩個接受。作爲一個單一的非規範化視圖,以多對多或另一種方式來表示一個多人和一個人?
現在,讓我們開始假設我有以下模式。這是我設計的真正模式的簡化版本,省略了不相關的列。名字已經改變,以保護無辜者和我的工作。
tree
具有以下屬性。
tree.id
tree.dob
tree.height
tree.forestid
forestid
是一個外鍵forest
表,這就是匯聚多個tree
行的方式。它有一個id
列和一些元數據列。
tree
和forest
都有潛在的許多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
)。