2009-08-08 83 views
1

我正在開發一個服裝Web應用程序,並希望瞭解如何在我的mysql數據庫中構建數據的建議。具有不同屬性的項目的數據庫結構

每件產品(衣物)都會以多種方式進行照相,我們稱之爲「模式」。例如,一件襯衫會被扣上釦子或釦子,或者被捲入/不捲入。一條褲子會有不同的屬性。我想在拍攝這些物品的方式上存儲信息,以便稍後可以使用該信息以特定方式顯示服裝物品。

所以一個方法是公正對待所有可能的屬性存儲在一個表中,是這樣的:

的productId(FK,PK) modeId(PK) isLoose isTuckedIn 尺寸 HasSmthUnderneath

其中屬性可以是另一個表中定義的值或代碼,如果不適用於特定模式,則爲NULL。

然後給定一個特定的productId和modeId,我想我可以過濾掉不適用的屬性的NULL值,只使用相關的屬性。

但是,我不確定這是否是存儲這種值的理想方式,因爲我會有很多NULL值,例如在僅以一種方式拍攝的一條褲子中。我聽說過EAV模型,這是否合適?

可能值得注意的是,屬性的​​數量將由我而不是用戶來決定,不應該有太大的改變;而且我的最終目標是提取特定模式的屬性,以便我可以在我的應用程序中使用該數據。

對不起,如果有什麼不清楚!

回答

5

我會被誘惑有以下規範化模式設計

Mode Table 

id | mode_style 
--------------- 
1 | buttoned 
2 | unbuttoned 
3 | tucked in 
4 | untucked 

Clothes Table 

id | name  | description 
---------------------------- 
1 | shirt  | mans shirt... 
2 | dress  | short sleeve 

Clothes_mm_Mode Table (Junction/Map table) 

mode_id | clothes_id 
-------------------- 
1  | 1 
1  | 2 
3  | 3 

然後你就可以輕鬆地查詢那些有一個敞着顯示

SELECT 
    c.id, 
    c.name, 
    c.description 
FROM 
    Clothes c 
INNER JOIN 
    Clothes_Mode cm 
    ON c.id = cm.clothes_id 
WHERE 
    cm.mode_id = 2 

如果某些類型的衣服都在始終顯示的衣服同樣的方式,即所有的襯衫總是有一個釦子和解釦顯示,你可以拿出Clothes_mm_Mode表,並引入一個共模式表,將模式映射到一個共同模式ID

Common_Modes Table 

id | name   | description 
-------------------------------------------------- 
1 | Men's Shirt | Common Modes for a Mens shirt 
2 | Women's Shirt | Common Modes for a Womens shirt 

Common_Modes_mm_Mode Table (Junction/Map table) 

common_mode_id | mode_id 
-------------------------------------------------- 
1    | 1 
1    | 2 
2    | 1 
2    | 2 

,然後服裝的每個項目有一個共同的模式類型

Clothing_Common_Modes Table 

clothing_id | common_mode_id 
---------------------------- 
1   | 1 

相關聯的這種設計的好處是,增加服裝的新項目時,只有一條記錄需要輸入到通用模式表將服裝項目與服裝類型常見的模式相關聯。當然這可以在沒有共同模式表的情況下進行處理,方法是將適當的記錄插入原始Clothes_mm_Mode表中以獲得新的服裝項目,但通過在數據庫中具有關係,它將更加突出,可見並且更容易保持。

1

我認爲你的設計很好。這將有可能應用於database normalization它,它可能會給你或者以下設計:

  1. 有每個屬性的一個表,每個(ID,propvalue)對。只爲這些表中的屬性實際應用的項目添加行。
  2. 具有通用表(id,propname,propvalue),也許每個屬性數據類型(布爾,數字,字符串)是一個這樣的表。

隨着你的描述,我覺得要麼是矯枉過正。唯一的例外情況是屬性是多值的(例如,可用顏色列表)

1

我個人認爲這種類型的東西的普通舊鍵/值對被低估了,所以如果你願意更多地控制它在應用程序本身,你也可以做這樣的事情:

create table ProductStates 
(
    ProductId int PK 
    ModeState nvarchar(200) PK 
) 

在我心目中的好和簡單。您不會獲得多餘的空值;如果產品具有該模式,那麼就有一排,如果沒有的話。還意味着如果有新狀態,則不需要更改模式。如果您希望可以將ModeState鏈接到ModeStates查找表,如果您認爲完整性將會成爲問題。

create table ProductStates 
(
    ProductId int PK 
    ModeStateId int PK 
) 

create table ModeStates 
(
    ModeStateId int PK 
    ModeStateDescription nvarchar(500) 
    (...whatever else you might need here) 
) 

...儘管這可能是多餘的。

只是一個替代方案,不知道我是否會這樣做(取決於簡要說明)。我的規格是否正確?

相關問題