2017-04-10 61 views
0

我有一個表「AvailableProducts」具有以下字段:存儲更新

StoreID int, 
ProductID int, 
ProductPrice decimal, 
IsAvailable bit 

ProductPrice可以通過銷售人員在店內通過價格的改變可以或可以更新從品牌更新。 現在存儲的價格變化歷史,我創建了一個歷史記錄表如下:

Table ProductPriceHistory 
UpdateID int, 
StoreID int, 
ProductID int, 
ProductPrice decimal, 
IsAvailable bit, 
UpdatedBy int, 
UpdatedAt datetime 

我現在面臨的問題是,保持BrandID或SalesPersonID(即所做的更改價格)在UpdatedBy場是錯誤的設計。

我可以修改它是這樣的:

Table ProductPriceHistory 
UpdateID int, 
StoreID int, 
ProductID int, 
ProductPrice decimal, 
IsAvailable bit, 
BrandId int, 
SalesPersonID int, 
UpdatedAt datetime 

這將讓我在使用ID字段BrandSalesPerson表的外鍵引用更新實體。但是它也會導致許多空列或空列值,因爲只有一個實體,即brandSalesPerson可以在給定時間更新價格。

我還可以創建兩個不同的歷史表,以節省SalesPersonBrands分別進行更新,但這種解決方案看起來並不吸引人。 任何有關此設計改進的建議,因爲我希望將此錶的歷史記錄保存在一張表中。謝謝:)

+0

我正在使用SQL Server – Navdeep

回答

0

您可以創建一個ObjectType表2項:

CREATE TABLE [dbo].[ObjectType](
    [ObjectTypeId] [int] NOT NULL, 
    [ObjectTypeName] [nvarchar](100) NULL) 

GO 
INSERT INTO dbo.ObjectType VALUES (1, 'Brand') 
INSERT INTO dbo.ObjectType VALUES (2, 'SalesPerson') 

新列ObjectTypeId然後添加到表ProductPriceHistory

ALTER TABLE ProductPriceHistory 
ADD ObjectTypeId int 

你可以寫日誌了多種項目的不僅適用於SalesPersonBrands

0

這是acommonquestion - 關於多態性的面向對象概念經常被問到。

有3種標準解決方案 - 您已確定其中的兩種;最後一個是在單個表格中對公共字段進行建模,併爲變體數據提供單獨的表格。這將有「sales_update」和「brand_update」表,updateID上的外鍵返回到更新歷史記錄表。

沒有優雅的解決方案 - 關係模型根本不支持這種用例,特別好。您需要查看系統的其他部分,並選擇最適合您的解決方案。通常情況下,這就是「一張桌子存儲所有模型」 - 但你的情況可能會有所不同。