2012-09-19 55 views
2

我正在使用asp.net web表單和linq-to-sql構建一個分類廣告網站。如何創建類別和子類別的「eBay風格」層次結構?

銷售物品需要按層次分類,但是,單個物品可能處於多個子類別中。

舉例來看看eBay上的this battery。請注意,有兩個麪包屑:

聲音&視覺>多功能電池&電源>充電電池
和以及:
電腦/平板電腦&網絡>筆記本電腦&臺式機配件>筆記本電池

除了一個項目屬於多個類別,類別也可以有多個父項目,例如當瀏覽類別「聲音&視覺>電池」或「電子產品>電池」時,在兩種情況下(例如,可充電或不可充電等),應該看到完全相同的電池子類別。

我不確定如何開始構建數據庫表格,更不用說從網站上查詢它們,所以任何幫助或指導都會受到很大的關注。

我看了一些文章,如Storing Hierarchical Data in a Database,但不認爲它適用於我的情況,因爲這些項目和類別的多對多性質。

謝謝。

回答

0

感謝@ bhrugesh-patel和@ andrew-walters試圖回答我的問題。然而,在進一步的研究中,似乎上述層次結構被稱爲定向無環圖(DAG),即幾乎是一棵樹,但有一個主要區別:您可以通過不同的路徑到達相同的節點。圖形數據庫如Neo4j專爲存儲像DAG這樣的結構而設計,但由於我堅持使用關係數據庫(SQL Server),我將嘗試實施本文中提到的解決方案:A Model to Represent Directed Acyclic Graphs (DAG) on SQL Databases

供參考:另外question on SO也更詳細地討論了這個話題。

3

最近,我遇到了同樣的問題,我在一個高大的表中存儲類這樣

CATEGORIES 
------------------ 
Id 
Text 
ParentId 

到目前爲止,它的工作對我來說,但我很好奇,如果更好的答案一起去

對於你的榜樣,你可能想給父母拆分爲一個單獨的表,因爲你希望能夠有一個多一對多的關係

你可以做這樣的

CATEGORIES 
---------------- 
Id 
Text 


CATEGORY_PARENTS 
---------------- 
ID 
ParentId 
3

通常最有效的方法是儘可能在最低級別分解數據並儘可能避免數據冗餘。簡而言之,儘可能多地拆分表,同時將相關數據保留在一個組(或表中的一個表)中,並確保您不重複表中的任何實際數據(通過在ID上創建連接表)。

我不知道你是多麼願意改變你的數據庫模式或者你目前的架構是如何構建的,但一個解決方案可以爲您創建一個表,用於存儲所有主要類別(可以稱之爲表A),另一個表對於第二級別的類別(表B)和一個最低級別的類別(表C)。

然後,您可以創建一個新表(表D)來附加表A和表B.所以現在您的主要類別和子類別已連接。

現在創建子類別的子類別是一個挑戰。你可以通過在表D中增加一個字段來解決這個問題,表明當前項目是否是'子子項目'(我知道,我的命名意義很糟糕:P)。即如果指示符字段是0,則它是子貓,否則指示符字段值是父子條目的標識符。這是一種自我加入。

對於屬於多個類別的項目,再創建一個連接項目表和表D的表(表E),在此將'itemID'與'subcatID'連接起來。即,如果電池的ItemID是10,可再充電電池的subcatID是5和筆記本電腦的電池的subcatID爲7,則你讓兩行表E

itemID  subcatID 
    10    5 
    10    7 

當搜索,搜索所有10,你將有所有類別。

再次,這是一個可能的解決方案。您也可以使用星型模式,但它對數據倉庫特別有效。 如果您的類別級別數字是固定的(即您只有3個級別類別),那麼您可以使用級聯樣式表(即表A是主貓,表B是子貓,而表C是最後一個子子表貓。)。這會讓你的查詢有點長,但是很簡單。 我只是在數據庫字段中開始,因此使用數據庫標記移動/標記此問題可能會爲您提供更好的答案。

祝你好運!

+0

星型模式似乎是一個有趣的方法。我已經投了票,一旦我能夠看到它是否適用於我的情況,我會接受答案。謝謝。 – Adnan

+0

非常歡迎你:) –