存储历史记录表中不同更新程序的更新

时间:2017-04-10 08:46:47

标签: sql sql-server database-design

我有一张桌子" 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

我面临的问题是在UpdatedBy字段中保留BrandID或SalesPersonID(这会对价格进行更改)是错误的设计。

我可以将其修改为:

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

这将允许我使用Id字段通过BrandSalesPerson表中的外键引用更新实体。但它也会导致许多空列或空列值,因为只有一个实体,即brandSalesPerson可以在给定时间更新价格。

我还可以创建两个不同的历史记录表来分别保存SalesPersonBrands所做的更新,但此解决方案看起来并不吸引人。 有关此设计的任何改进建议,因为我希望将此表的历史记录保存在单个表中。谢谢:))

2 个答案:

答案 0 :(得分:0)

您可以创建一个包含2个项目的ObjectType表:

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

编写多种商品的日志

答案 1 :(得分:0)

这是a common question - 它经常被问及与多态的对象定位概念有关。

有3个标准解决方案 - 您已经确定了其中两个;最后一个是对单个表中的公共字段进行建模,并为变量数据提供单独的表。那将有表" sales_update"和" brand_update",将updateID上的外键返回到更新历史记录表。

没有优雅的解决方案 - 关系模型根本不能很好地支持这个用例。您需要查看系统的其余部分,并选择最适合您的解决方案。通常,"一个表存储所有模型" - 但你的情况可能会有所不同。