2013-02-15 60 views
1

我有以下的數據庫結構:獲得從子類SQL查詢項目

[CATEGORY] 
category_id 
parent(default 0) 
title 

[PRODUCT] 
product_id 
title 

[PRODUCT_TO_CATEGORY] 
product_id 
category_id 

示例數據類別

1 Sony 
2 Sharp 
3 Samsung 
. ... 

1 0 TV 
2 1 PLASMA 
3 1 LED 
. . ... 

產品的樣本數據

示例數據爲PRODUCT_TO_CATEGORY

所有我想問如果我的結構良好的
1(Sony) 1(TV) 
2(Sharp) 2(PLASMA) 
3(Samsung) 2(PLASMA) 

第一。例如,我應該將類別和子類別ID分配給每個產品,還是一個類別工作良好?

然後根據每個產品屬於一個類別的假設和一個類別可能有一個或多個父類,我如何檢索當前和每個子類別的產品?
例如,打電視類別應列出索尼,夏普和三星,而不只是索尼項目。

+0

不可以。您不會在產品中嵌入父/子。這可能會導致加入不良關係的可能性,例如(「遊戲控制檯」,「戴爾」)或(「創新公司」,「微軟」)。僅嵌入一個類別,從中檢索相關聯的父項很麻煩。 – 2013-02-15 14:29:47

回答

1

父(默認爲0)

使用NULL而不是0這將允許你使用正確的外鍵(如下圖所示)。


我應該既類別和子類別的ID分配給每個產品

你不應該。只分配適用於該產品的最具體的子類別。所有超類別都可以從CATEGORY表中定義的層次結構中推斷出來,因此在產品中存儲(甚至是其中之一)是多餘的。

由於性能原因,有時候這樣的冗餘是有道理的,但是你必須在數據一致性之間進行平衡。在這種情況下,沒有很好的聲明方法來保持冗餘數據與「主」數據同步 - 您必須通過觸發器或(上帝禁止)應用程序代碼來完成此操作,並且您可能會引入併發錯誤,除非你認真考慮你的鎖定策略非常,非常非常非常非常


然後基於屬於一個類別每個產品的假設......

這個假設讓你的模型不正確。爲了這款N正確型號:1間的關係,你並不需要結合表PRODUCT_TO_CATEGORY,你只需要產品和類別之間的外鍵:

enter image description here

注意:請在PRODUCT.CATEGORY_ID爲空的,如果你想允許無類別的產品(即你的關係實際上是N:0..1而不是N:1)。

而且你的數據會看起來像:

CATEGORY: 

1 TV  NULL 
2 PLASMA 1 
3 LED  1 

PRODUCT: 

1 Sony 1 (TV) 
2 Sharp 2 (PLASMA) 
3 Samsung 2 (PLASMA) 

我怎麼可以檢索產品當前和每一個孩子類別?

首先識別屬於所需「子樹」的所有類別,然後檢索連接到它們的產品。在這種情況下,所有的電視搜索可以做這樣的:

  1. 獲得「頂」類別您正在搜索的ID:1(TV)。

    SELECT CATEGORY_ID FROM CATEGORY WHERE TITLE = 'TV'

  2. 獲取所有的子類別的ID:2(血漿)和3(LED)。

    SELECT CATEGORY_ID FROM CATEGORY WHERE PARENT_ID IN (1)

  3. 重複步驟(2),直到你到達的層次結構的「底部」:

    SELECT CATEGORY_ID FROM CATEGORY WHERE PARENT_ID IN (2, 3)

    上面的查詢將返回一個空的結果對你的榜樣的數據集,所以你會知道你可以停下來。在更復雜的層次結構中,您可能需要多次重複上述查詢,始終用最近檢索到的「層」類別替換IN列表。

    如果您碰巧在數據中有循環,請小心無限循環!獲取連接到任何已識別類別的所有產品:1(TV),2(PLASMA)和3(LED)。

    SELECT * FROM PRODUCT WHERE CATEGORY_ID IN (1, 2, 3)

不幸的是,MySQL不支持那種遞歸查詢的,它會讓你做的一切,在一個單一的數據庫往返。

0

閱讀有關用於分組產品的嵌套集。 http://en.wikipedia.org/wiki/Nested_set_model

它允許您在關係數據庫中創建一個很好的結構,以將產品分配給類別。比大多數人提出的典型的兒童 - >父母模型好得多。

+0

有趣。但是當你讓管理員爲用戶創建這些類別時,我不明白爲什麼要使用這種技術。類別和子類別不是固定的,而是CMS的一部分,看起來這種技術的更新和計算可能是一團糟.. – mallix 2013-02-17 12:18:58

+0

您可以輕鬆地爲用戶創建用戶界面以創建/管理類別,然後使用該類別映射產品做法。這是非常好的,因爲你可以將一個產品映射到父類別,而不是所有的孩子。您還可以將一個產品映射到子類別,並自動顯示在所有父母身上。我已成功地將它用於_with_用戶分配給在線拍賣網站,該網站將產品映射到類別。 – ryan1234 2013-02-18 00:53:46