5

我只是在學習如何實現嵌套集模型,但仍然對涉及可能是多個類別的一部分的項目的某個方面存在混淆。下面給出的例子來自HERE拉,反映出許多其他的例子,我所遇到的...分層數據 - 嵌套集模型:MySql

Hierarchical Data: Numbered Tree

Table

你如何避免重複在DB當您添加蘋果,因爲它們是多色(即紅色,黃色,綠色)?

回答

5

你不避免重複,蘋果(或蘋果的引用)將被放置在你的樹的兩倍,否則它不會是一棵樹,而是一個圖。如果您構建... Swing JTree或HTML樹,則您的問題同樣適用;)。

嵌套集模型只是一種有效的方法來推送和遍歷關係數據庫中的樹結構。它本身不是數據結構。它在MySQL用戶中更受歡迎,因爲MySQL缺乏處理樹結構的功能(例如像Oracle提供的那樣)。

乾杯!

+0

是的,我一直在尋找一個答案,但無法找到任何明確的主題。我在這個時候使用MySQL,所以將來會遇到轉換爲非免費數據庫的問題,並重復Apple?或者我應該嘗試並通過不允許多個父母來解決這個問題,而只是使用嵌套集方法?還是有另一種方法來解決這個問題利用MySQL? – swisscheese 2011-03-20 12:25:15

+0

至少在Oracle的情況下,你不會遇到任何問題。嵌套集方法非常便於使用,因爲它使用標準的SQL結構。在一般情況下,我看不到蘋果_reference_的重複。儘管我很熟悉它,但從未在實踐中使用嵌套集。但是我會更關心樹的修改(添加/刪除/移動節點)。他們通常比較慢。另外請注意,這不是標準技術,您的解決方案的維護人員可能需要一個艱難的開始。 – 2011-03-20 13:26:02

+0

感謝您對此問題的幫助。如果你有機會,並且願意,你可以請看看我的問題,以此http://stackoverflow.com/questions/5395463/data-modeling-modeling-categories-subcategories-in-mysql – swisscheese 2011-03-22 19:04:54

3

嵌套集模型是1:N(一對多)關係的結構,您想使用M:N(多對多)關係(許多項目可以有蘋果作爲父項,但可以有多個一位父母)。

See this article

Wikipedia

但是你應該知道,該分級M:N的關係可以得到相當複雜的真快!

+0

是的,我理解這個概念,但不適用於嵌套集模型。所以這是我的問題,嵌套集模型可以處理這個問題,如果是的話如何? – swisscheese 2011-03-20 12:07:41

+0

@swisscheese它不能以任何簡單的方式。也許你可以嘗試只保存樹中的引用(指向不同的表的數據項的ID)。但我不認爲嵌套集合模型真的適合這個。 – 2011-03-20 12:12:09

3

在這裏大聲思考,但也許這將有助於查看一些屬性(如紅色,黃色和綠色)作爲'標記'而不是'類別',並用單獨的邏輯處理它們。這將讓你保持嵌套集模型,並避免不必要的重複。另外,它可以讓你保持你的類別更簡單。

這一切都在你如何看待這些信息。類別只是表示屬性的另一種方式。我明白你的例子只是爲了說明,但如果你想按顏色對水果進行分類,你爲什麼不以同樣的方式對肉類進行分類,即白肉和紅肉?很可能你不會。所以我的觀點是,可能沒有必要按照顏色對水果進行分類。

相反,某些屬性可以用其他方式表示得更好。事實上,它可以以最簡單的形式記錄在標記爲「顏色」的「食物」表格中。或者,如果這是一個非常常見的屬性,並且您發現自己重複顯示該值,則可以將其拆分爲名爲「顏色」的單獨表格,並將其映射到第三個表格中的每個食品項目。當然,更抽象的方法是將表格概括爲「標籤」,並將每種顏色包含爲單獨的標籤,然後將其映射到任何食品項目。然後,您可以將任意數量的標籤(顏色)映射到任意數量的食品項目,從而爲您提供真正的多對多關係,並將您的類別標識釋放爲更一般化。

我知道關於標籤是類別還是類別是標籤等問題一直存在爭議,但這似乎是他們可以互補的一個實例,並創建了更易於管理的更抽象和更健壯的系統。

+0

我有同樣的思考,不知道我是否錯過了一些可能的後果,但將顏色看作標籤還是有道理的。 – johnsnails 2014-01-09 03:57:51

0

舊的線程,但我發現這個問題的更好的答案。

由於蘋果可以有不同的顏色,你的結構是一個圖形,而不是一棵樹。嵌套集合模型不是適合的結構。

既然你在評論中提到你正在使用Mysql,更好的解決方案是使用Open Query Graph引擎(http://openquery.com/graph/doc),它是一個mysql插件,它可以讓你創建一個特殊的表格來放置關係,基本上parentId和childId。 奇妙之處在於,您使用特殊的列鎖存器查詢此表,具體取決於查詢中傳遞的值將告訴OQGRAPH引擎執行哪個命令。有關詳細信息,請參閱文檔。