我有兩種設計。想要檢查哪一個更適合你們。減少冗餘的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。
你知道設計的基數? – jcho360
是1報價只能有1種報價類型。現在,此優惠可以適用於使用或不使用過濾器。 –