2012-05-24 139 views
0

我有兩種設計。想要檢查哪一個更適合你們。減少冗餘的SQL表設計

所以我有三個表offer,offer_type和offer_type_filter。

表的原始設計

報價

id      int(10) unsigned  
code     varchar(48)   
offer_type_id   int(10) unsigned 
start_date    datetime    
exp_date    datetime    
value     int(10)    
updated     timestamp   
created     datetime    

OFFER_TYPE

id      int(10) unsigned   
name     varchar(48)    
condition varchar(512)    

offer_type_filter

id      int(10) unsigned 
filter_type    varchar(20)  
filter_value   varchar(50)  
offer_type_id int(10) unsigned 

現在,您可能會猜測,此優惠有一個類型,並且過濾器會指定在哪些特定情況下優惠活動適用。如果你想知道,那麼offer_type.condition主要是購買最低價20美元。 $ 300。 Offer_type_filter僅適用於麥當勞。優惠可以不用過濾器。

當前設計的一個概念是每次創建新商品時,即使類型相同,我也必須在offer_type中創建一個重複條目,然後在offer_type_filter中使用該類型(使用當前類型將會混淆現有商品)。

所以在數據庫重新設計方面,它是很明顯的,OFFER_TYPE不得offer_type_filter存在,所以我相信它必須改變這樣的事情

重新設計(與offer_type_filter和創造新的破除表過濾器。它基本上是重命名爲更合適的東西)

過濾

id int(10) unsigned 
filter_type varchar(20)  
filter_value  varchar(50)  
filter_type_set_id int(10) unsigned 

佛R以外的表,我想這兩個選項

選項1(從重新設計+其他表offer_type_filter從最初的設計一樣)

報價

id int(10) unsigned  
code  varchar(48)   
offer_type_filter_mapping_id  int(10) unsigned  

offer_type_filter_mapping

id int(10) unsigned 
filter_type_set_id int(10) unsigned  > from Filter table 
offer_type_id int(10) unsigned  

如果我選擇第一個設計,那麼我會減少offer_type_filter_mapping中的任何項目。對於沒有過濾器的商品,offer_type_filter_mapping將具有offer_type_id條目,並將null作爲filter_type_set_id。此外,對於我創建的每種類型,我都必須在映射表中放入一個條目。所以我不喜歡這方面的設計。

選項2(offer_type_filter從重新設計+其他表從最初的設計一樣)

報價

id int(10) unsigned  
code  varchar(48)   
filter_type_set_id int(10) unsigned > from Filter table 

我來選擇2只因爲在這種情況下,對每個冗餘filter_type_set_id報價和在我的情況下報價表是巨大的

想要批評你認爲哪種設計是最不痛苦的。頻繁使用案例:使用和不使用過濾器創建大量優惠。我們已經有接近40-50個優惠類型。類型表不能覆蓋所有場景,所以我們確實創建了10%的新類型。

另外我使用Spring和Hibernate,所以你可以從這個角度思考我的設計約束是什麼。

P.S.你甚至可以在mysql中添加它,如在offer_type_filter中爲每個表生成兩個id是不方便的,但我正在考慮它。 Prob使用虛擬表來生成或使用外部生成的ID。

+0

你知道設計的基數? – jcho360

+0

是1報價只能有1種報價類型。現在,此優惠可以適用於使用或不使用過濾器。 –

回答

0

我這樣看,一個報價只能有一個報價type_filter,所以它是一個1:N的關係

enter image description here

,並提供將採取OFFER_TYPE屬性,美過的。

基數爲N:M

enter image description here

編輯:
例如,如果你在offer_type_filter有。

offer_type_filter_id = 1 and it's 30% off. 
offer_type_filter_id = 2 and it's 10% off. 
offer_type_filter_id = 3 and it's 0% off. 
... 
etc 

和你的報價表,你可以有:

offer_id=1 and offer_filter_id=1 //this mean that product 1 has 30% off 
offer_id=2 and offer_filter_id=1 //this mean that product 2 has 30% off 
offer_id=3 and offer_filter_id=2 //this mean that product 2 has 10% off 
offer_id=4 and offer_filter_id=3 //this mean that product 2 has 0% off 

... 

etc 

如果基數是一個盤可只有一個報價類型,是第一個設計。

如果你的基數是一個提供可以有多種折扣和多個產品相同的折扣,我推薦的第二個設計

+0

但是我看到它的方式,您認爲報價類型可以應用於過濾器。正如我在我的文章中提到的,優惠類型在300分鐘時可享受30%折扣。爲什麼要這樣說:「此優惠僅適用於說品牌X,或僅適用於鞋子」。在當前的設計中,如果我必須創建相同類型的商品(300%的商品再次優惠30%),但是這次使用品牌Y,則必須創建新的商品類型,因爲如果我使用現有類型,則只生成品牌x現在頭腦也會開始檢查品牌Y,因此無法工作。 –

+0

@SmilesinaJar請檢查編輯,並讓我知道如果我理解你 – jcho360