2010-10-21 29 views
1

由於缺乏更好的術語,使用「鏈式字符串」構建嵌套類別「系統」的想法。計劃如下:是否將類別嵌套爲「串連」是一個壞主意?

類別slu could可能像「購物 - 服裝 - 女性」。這與深度分類有關:購物>服裝>女裝。

數據庫中的一個對象會有一個包含slug的類別字段。假設有幾個對象,在購物>服裝類別中有不同的slu,,可能是:「shopping-clothing-men」,「shopping-clothing-kids」和「shopping-clothing-other」。

我有一個集合或字典,可以將那個slu translate翻譯成對最終用戶更有意義的東西(例如「shopping-clothing-women」 - >「Women's Clothing」)。

如果我想選擇是在購物>服裝類的所有對象,我會做這樣的事情:

DB.Objects.Where(a => a.Category.Contains("shopping-clothing")); 

,並會找回所有的女裝,男裝,兒童服裝小類的購物>服裝類別。

目標是簡單的查詢,但保持強大的能力接近無盡的子分類沒有瘋狂的數據庫關係和JOINS。我也傾向於將來將我的應用程序適配到NoSQL數據庫,這將有助於實現這一點。

但是,上面的查詢令我擔心...會不會很慢?

這個計劃是一個壞主意嗎?

+0

你保持有效蛞蝓值的表?如果你在商店裏穿衣服女人而不是購物服裝的女人,會發生什麼?會錯過這個記錄嗎? – 2010-10-21 10:55:04

+0

是的,有一個內存收集與有效的類別slu。。謝謝你指出,雖然。 – Chaddeus 2010-10-21 12:09:10

回答

1

這聽起來像個好主意。我看到的唯一直接的問題是很難重命名類別。解決這個問題的一種方法是鏈接類別的內部ID而不是代碼。關於Contains,我可能會去StartsWith。這將產生一個LIKE 'shopping-clothing%',並且使用正確的索引速度會快很多。

還有一個提示:如果你用短劃線添加每個類別,如果一個類別與另一個類別具有相同的前綴,就不會出現問題,如"shopping-clothing-womans-"。那麼你總是可以使用StartsWith("shopping-clothing-")

+0

不打算重命名類別(但是,從來不知道呃?),好點。你說得對,StartWith會更好。謝謝。所以你認爲只要我在類別上索引,這會運行得很快? – Chaddeus 2010-10-21 07:14:50

+0

是的,沒問題。請考慮使用像我描述的短劃線來附加所有類別。這將使系統更穩定。 – 2010-10-21 07:20:32

+0

我同意,好主意。可能的類別將通過硬編碼列表進行控制,因此應該非常穩定。 – Chaddeus 2010-10-21 07:22:18

0

另一種方法是建立一個單獨的類別表,其中包含可以嵌套的類別(不包括狗屎Sherlock?)。像這樣:

| ID | Name | ParentId | 

在ParentId爲0的情況下,它是主要類別。

然後在您的產品表中,您的類別列將引用類別表中的類別。然後,您可以輕鬆地從類別表中選擇slu g。

如果你需要搜索購物,衣服內的所有產品,您的查詢可能看起來像:

SELECT * FROM PRODUCT WHERE CategoryId IN 
    (SELECT ID FROM CATEGORY WHERE ParentId = 'shopping_clothing_id') 
+0

謝謝。我正致力於不依賴於關係數據庫的概念,朝着NoSQL/Document數據庫範式邁進。 – Chaddeus 2010-10-21 07:22:58

相關問題