我正在建模一個網上商店的數據庫,並且遇到了廣告問題。基本上問題是爲了簡單起見,是否忽略數據庫規範化規則。 以下是問題之前我圖中的相關部分。 Database diagram 基本上,產品可以有選項(大小,味道,顏色),但只能從一個選項組中選擇。由於選項組可以有多個選項,並且使用它的產品可以採用子集,因此會創建ProductOption表。接下來我們有一個SpecialOffers表。接下來,一個特別優惠可以有很多產品和產品可以屬於許多特別優惠,因此關聯表SpecialOfferProducts。所有這些都可以正常工作,直到特別優惠包含具有選項的產品。這是我遇到問題的地方。我有幾個想法。如何避免複合實體鍵和約束問題(產品,選項,選項組,特殊訂單)
第一個想法: 在SpecialOfferProducts和ProductOptions之間創建一個關聯表。我不喜歡這個想法,因爲這兩個表都有複合主鍵,並且創建一個具有由兩個複合主鍵組成的複合主鍵的表看起來很奇怪,我從來沒有見過類似的東西。
第二個想法: 在SpecialOfferProducts和Options之間創建一個關聯表。這看起來不對,因爲選項並不直接綁定到產品。這仍然有效,主鍵會更簡單一些。
第三個想法: 這是我最喜歡的一個,但它違反了一些規則。更改SpecialOfferProducts表。使其擁有自己的主鍵,並將SpecialOffers,產品和選項作爲外鍵。只需使選項外鍵可空,並解決問題。當然,問題在於我沒有創建一個關聯表,我應該並且正在使外鍵可以爲空。這會讓我的代碼稍微複雜一些,以處理所有這些,但我仍然認爲這比其他方法簡單得多,因爲我減少了組合鍵的數量,並且在產品在特價優惠使用一個選項。
我的問題是,哪一個選項最好?有沒有更好的選擇,我沒有提到?
使用馬丁的風格符號
OptionGroups與表選項(0,n)的關係。選項與表格OptionGroups有(1,1)的關係。這些表的目的是存儲顏色,大小等信息。例如,OptionGroups條目顏色具有黑色,白色等選項條目。
產品表與表OptionGroups有(0,1)的關係。 OptionGroups與表Product有(0,n)關係。產品表與表格選項具有(o,n)關係。選項表與表格產品具有(o,n)關係。多對多關係生成關聯表ProductOptions。 ProductOptions有一個複合PK ProductID,OptionsID。這些表的目的是允許產品從某個選項組中選擇(但不必),但不需要具有該組中的所有選項。
示例1.產品沒有任何選項,因此FK Product_OptionGroups爲空。在這種情況下,產品在ProductOptions表中沒有任何條目。
示例2.產品具有選項(可以說是顏色),因此FK Product_OptionGroups不爲空(具有coresponding選項組的ID)。選項組的顏色可以有很多顏色,產品可以使用其中一種或多種顏色。產品使用的顏色是ProductOptions表中的條目。
SpecialOffer表與表產品具有(1,n)關係。 Products表與表SpecialOffer具有(0,n)關係。多對多關係創建關聯表SpecialOfferProducts。該表具有PK SpecialOfferID,ProductID。該表具有一個數量屬性,指示產品的數量。
例子。 SpecialOffer A包括產品A的一個實例和產品B的兩個實例。
可以說產品A有選項。現在SpecialOfferProducts表必須引用正確的選項(也許產品可以是藍色和紅色,特別優惠只包括紅色產品)。這是當前模式不起作用的地方,必須引入額外的表格(想法1和2)或現有表格改變(想法3)。
嗨。謝謝您的回覆。通過彙總表格我的意思是聯結表格,或者像你稱之爲聯結表格。基本上我需要一個可以容納許多產品的特別優惠。產品可以有很多選擇。因此,當特價優惠引用具有選項的產品時,還需要引用該選項。所以對於這種情況,我有點困惑如何建模。如果我按照通常的方式對它進行建模,那麼我可以得到我在第一個想法中描述的內容。無論如何,我已經實施了第三種選擇。對不起如果我的問題不清楚。現在有什麼想法? – xmarksthespot
我再說一遍:除了「選項o在g組」,「產品p有g組選項o」和「產品p有特別優惠」之外,您的問題中沒有任何理由。您沒有解釋/證明「因此,當特價優惠引用具有選項的產品時,還需要引用該選項」。滿足這些謂詞的AND的行是它們表的JOIN中的行。你是不必要地和隱約地害怕複合材料CK。仔細重讀我的意見。 PS「聚合[d]」表與連接/關聯/連接表不同。 – philipxy
你是對的術語。我道歉。特別優惠有一個或許多產品。因此,聯結表SpecialOfferProducts。產品具有一個或多個特定組的選項。因此交接表ProductOptions。現在,考慮特別優惠具有選項1的產品A和具有選項2的產品A的情況。現在,我需要在結點表SpecialOfferProduct和ProductOptions之間的聯結表。所以複合鍵由2個複合鍵組成,因此我的想法3。我可以通過代碼強制執行非重複條目,但架構不正確。 – xmarksthespot