代码之家  ›  专栏  ›  技术社区  ›  David

在事务表中复制数据是一种糟糕的设计吗?

  •  1
  • David  · 技术社区  · 14 年前

    我有两张桌子产品

    Product
    --------
    ProductID
    ProductName
    

    和SalesTransaction。

    SalesTransaction
    --------
    TransactionID
    ProductID
    ProductName
    

    用户要求声明“产品名称可以随时间变化,但此修改不得对已存在的事务产生任何影响”。我想知道,我的设计适合这种要求吗?如果没有,如何改进我的设计?

    3 回复  |  直到 14 年前
        1
  •  2
  •   Andrew Cooper    14 年前

    如果要求意味着旧的交易必须在交易时记录产品的名称,那么,是的,这是实现这一点的一种方法。

    另一种方法是使用新的productID对产品的名称更改进行建模。您需要在产品表中添加一个字段来标记历史记录。当产品名称更改时,只需使用新产品ID和新名称复制产品记录,并将旧记录标记为历史记录。

        2
  •  1
  •   HLGEM    14 年前

    这是传统的方法。这不是非规范化,而是从某个时间点保存所需信息。不要放弃对订单中商品的价格做同样的事情。有些人不认为这样做(无论要求是否明确说明),并且当他们开始从订单中运行财务报告时,为自己创造一个伤害的世界,因为附加在订单上的价格不再是客户的价格。托默被起诉了。

        3
  •  0
  •   Andrew Kennan    14 年前

    您还可以将产品拆分为两个表,如product和productdetail,其中productdetail存储名称和价格等可以更改的内容。ProductDetail还具有“开始日期”和“结束日期”列,用于指示其处于活动状态的时间。将记录放入productdetail后,唯一可以更改的列是“结束日期”,其他所有内容都是不可变的。当产品名称更改时,插入新的ProductDetail并在旧的ProductDetail上设置结束日期。

    在SalesTransaction表中,您可以连接到ProductDetail而不是Product,并且您将始终获得正确的产品名称。