2011-05-02 70 views
1

海蘭!如何在mysql中保存樹?

我想要的類別保存到我的烹飪食譜。

像:肉醬意粉

meal-->noodle_dishes-->italian-->spaghetti_bolognese 

如何保存這種繼承?

THX

+1

鄙視你如何建立你的數據庫.... – Ruben 2011-05-02 13:27:17

+1

我認爲這可能是他所要求的,基於標籤,但閱讀這個問題本身並不明確。 – 2011-05-02 13:30:33

+1

'DENY PRINT_DATA TO「* @ *」; SET PRINT_POLICY = DISALLOW LOG(「SAVE A TREE」)_ _(抱歉,無法抗拒)_ – sehe 2011-05-02 13:38:51

回答

3

如果你不介意做你的周圍類別樹的管理家務,然後由此配方進入葉(最低)水平cateogry和所有其他類別的關係都在使用外接數字平了可以使用的方案。您仍然可以使用遞歸關係來管理樹,但不會使用它來檢索/查詢收件人。

這是它會是什麼樣子:

Category 
- Category ID 
- Name 
- (anything else you want to know about categories) 
- Parent Category ID (FK to self/NULL for top level) 
- Lower Bound 
- Upper Bound 

Recipe 
- Recipe ID 
- Category ID (FK - points to the lowest level/most specific category) 
- (anything else you want to know about a recipe) 

訣竅是下界和上界。您填寫的欄目表是這樣的:

Category: 
    Desserts ID=1 Parent=null {Lower=1, Upper=4} 
    Cakes ID=2 Parent=1 {2, 4} 
    Chocolate Cakes ID=3 Parent=2 {3, 3} 
    Fruit Cakes ID=4 Parent=2 {4, 4} 
    Appetizers ID=5 Parent=null {Lower=5, Upper=...} 
... 

所以,當你查詢recipies是沙漠,例如,你會發現有間的下限和上限的蛋糕類的類別ID的所有recipies(即在2和4之間)。

爲了使這項工作,你需要有程序代碼,將回去重新計算所有的上限和下限的在您的類別表,每當你做出改變的類別層次結構。由於這種情況很少發生,通過與對受益者的變化進行比較而很少發生。如果你想變得優雅,你可以找到方法將重新計算限制在受影響的區域。

爲了解釋概念的簡單性,我根據類別ID設置了下限和上限。顯然你不能使用增量ID來達到這個目的,因爲你的類別必須被排序。因此,您的類別表需要第二個候選鍵,當您在層次結構更改時執行遞歸限制計算時可以重新計算這個鍵。因此,在查詢時間,您使用真實(遞增)類別ID來查找葉子類別,然後使用該類別記錄的下限和上限過濾其他類別,並根據您的條件進行接合。

2

最簡單的將是「類別」表,對自身的外鍵,被稱爲「父類」或類似的東西。頂級類別(即用餐)在該字段中將具有NULL。

+1

該模式在MySQL中檢索相當複雜,因爲不支持分層/遞歸查詢。 – 2011-05-02 13:29:22

0

你可以做到這一點作爲一個一對多的關係,例如:

category 
-------------- 
    id 
    cat_name 
    cat_parent 

哪裏父類的ID

然而cat_parent引用,要知道,MySQL不支持遞歸查詢,所以使用這種設計,你不能做深度子類別搜索。我讀過它可能使用不同的設計,我只是不記得來源。

More detailed article on MySQL hierarhical data

1

我認爲最好的辦法是不要把他們當作一棵樹,而是去標籤的路線。所以你會有一個配方表和一個配方標籤表。

0

因此,假如配方可能有一個名稱,類別,的ingredients--列表,並可能是一個作者或其他元數據 - 你想放置在樹中的所有你的食譜。

最簡單的方法是在食譜表中添加另一列 - parent_recipe_id - 然後假設那些具有父級ID的行是「根」,應該顯示爲基本類別。

(類別‘或配方組表克里斯的單獨的建議’將更加明確樹形結構)。