【问题标题】:Storing updates from different updaters in the History table在 History 表中存储来自不同更新程序的更新
【发布时间】:2017-04-10 18:44:20
【问题描述】:

我有一个表“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 所做的更新,但这个解决方案看起来并不吸引人。 任何有关改进此设计的建议,因为我希望将此表的历史记录保留在单个表中。谢谢:)

【问题讨论】:

  • 我正在使用 SQL 服务器

标签: sql sql-server database-design


【解决方案1】:

您可以创建一个包含 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,您还可以为多种项目编写日志

【讨论】:

    【解决方案2】:

    这是a common question - 它经常与多态的面向对象概念有关。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-18
      • 1970-01-01
      • 2017-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-15
      相关资源
      最近更新 更多