2010-10-07 48 views
3

如果我有一個銷售蘋果和顯示器的在線購物網站,並且這些網站存儲在不同的表格中,因爲蘋果的顯着屬性是彩色的,而顯示器的顯示屬性是分辨率,我將如何將這兩個添加到發票表中,同時仍保留參照完整性並且不將這些表聯合起來?一個訂單上的多個不同產品的表設計

     Invoices(InvoiceId) 
           | 
        InvoiceItems(ItemId, ProductId) 
           | 
         Products(ProductId) 
       |           | 
Apples(AppleId, ProductId, Colour) Monitors(MonitorId, ProductId, Resolution) 

回答

3

首先,我將它們存儲在一個產品表中,而不是放在兩個不同的表中。第二,(除非每個發票只用於一個產品),我不會將它們添加到單個發票表中 - 相反,我會設置一個Invoice_Products表,以便在這些表之間進行鏈接。我建議你看看Database Normalisation

+0

如果我將它們存儲在單個組合產品表中,那麼這是否意味着只有根據特定產品是顯示器還是Apple而只能填充可分辨的Resolution和Color列?規範化建議只在表中包含列,如果它們直接與主鍵相關。 關於鏈接表,好點。我過分簡化了這個問題,錯過了這個細節。我會更新這個問題。 – Rob 2010-10-07 15:46:24

+1

發票(InvoiceId) | InvoiceItems(ItemId,ProductId) | 產品(ProductId) | | 蘋果(AppleId,ProductId,Color)監視器(MonitorId,ProductId,Resolution) – Rob 2010-10-07 15:47:59

0

因此發票表有一個ProductID FK,而ProductID可以是AppleID(PK顏色)或MonitorID(PK分辨率)?

如果是這樣,您可以引入一個ProductTypeID,其值爲0 = apple,1 = monitor或isProductTypeApple布爾值(如果只有2種產品類型並將其包含在ProductID表PK中)。

您還需要在蘋果表ProductTypeID場和監控臺PK。

0

我喜歡這些名稱 - 值表...這可能是更容易重新設計如此這般「產品」,然後「產品細節」 ......產品的詳細信息包含產品ID,詳細類型,然後值。這將允許您將蘋果和監視器放在同一個表中,而不管標識屬性如何(並將其保留爲稍後添加的其他產品)。

可以在發票表中採取類似的方法...有一個'product_type'列,告訴你要查看哪個表(蘋果或監視器),然後是一個'product_id',它引用蘋果的任何ID列/監視器表。查詢上像這樣的設置是有點困難的,可以強迫你使用動態SQL ...如果你有過做上面的重新設計沒有控制(這裏張貼其他答案參考)我只走這條路

第一種解決方案是優惠的,我會認爲...將這個數據庫的設計更改爲與產品的名稱值對,以後您可以節省頭痛地編寫您的查詢。

+0

名稱 - 值表是否意味着只有String(varchar)值?如果某些屬性是數字或日期值,那麼需要進行可比性/類型安全呢?顯然這裏的查詢/用戶界面很複雜,但我面臨的主要困難似乎首先是數據庫結構。 我想也許我可以製作4個不同的名稱 - 值表,每個表都包含不同的類型(int,float,datetime,varchar),但是這造成了知道如何鏈接到正確的名稱 - 值表的新問題! – Rob 2010-10-07 15:52:47

+0

是的,你對這個限制是正確的...... varchar或nvarchar是你唯一可以處理任何數據類型的數據類型。可能有一個「數據類型」列與值一起使用,儘管它後來迫使你進入更動態的SQL來轉換爲不同的數據類型。任何你無法將它存儲爲varchar的原因,並在你的查詢中引用它時將其轉換爲你需要的任何數據類型? – Twelfth 2010-10-07 16:33:11

1

您的數據模型的問題是您需要一個參考方案來識別產品嗎?也許SKU

然後通過分配SKU將每個蘋果識別爲產品。同樣適用於顯示器。然後使用發票項目中的SKU。事情是這樣的:

產品{} SKU關鍵 {} SKU;

invoice_item {INVOICE_ID,SKU} 鍵{INVOICE_ID,SKU};

apple {color,sku} key {color} key {sku};

monitor {size,sku} key {size} key {sku};

適當的約束......特別是,蘋果的{} SKU工會和監視{} SKU產品== {} SKU。

相關問題