【问题标题】:Accepted approach regarding data-modelling regarding Product - Order - deleted Product关于产品 - 订单 - 已删除产品的数据建模的公认方法
【发布时间】:2012-12-06 10:03:46
【问题描述】:

我们在为新应用程序建模数据时遇到了两难境地。情况有些复杂;所以我写了一个简化的情况,相当于我们的问题:

  • 在 Web 应用程序中,管理员创建产品列表;标题,描述,链接到某些产品类别;等等。所以有一个产品实体

  • 在前端,用户订购某些产品;所以有一个 Order 实体,其中包含与其关联的 OrderLine 实体数组;每个 OrderLine 实体都有一个与之关联的产品。

  • 几天后,订购了多个产品。然而,管理员需要更改产品的价格,甚至删除产品,因为它不再可用。

  • 在数据库中,仍然有与 OrderLines 关联的 Orders,它们链接到 Products。当管理员查看数据库中的订单时会发生什么情况,这些订单之前在数据库中记录了产品被更改并且与被更改的产品相关联?

  • 尽可能避免冗余;在数据库级别,您将如何对这种情况进行建模?

【问题讨论】:

    标签: database transactions product redundancy


    【解决方案1】:

    我以类似的方式模拟了ProductsOrdersOrderItems;我唯一要添加到@Neville K 的答案是我之前已经创建了ProductPrices 自己的域实体;毕竟,添加新价格与添加新 Product 不同。 ProductPrice 有价格、货币以及开始和结束日期;像这样的模型价格还可以为特定客户提供针对特定组的价格或折扣。

    【讨论】:

      【解决方案2】:

      我对这个问题的解决方法是将“产品”的更改记录为一流的域概念。通常,这意味着在订单表中包含“valid_from”和“valid_until”字段,并通过将当前记录的“valid_until”日期设置为 now() 并为具有 now() 的 valid_from 的产品插入新行来记录更改) 和 null valid_until。

      这允许您的订单检索创建订单时的产品信息,这反过来又允许您的业务逻辑推理该数据 - 尊重创建订单时的价格,例如。

      另一种方法是在产品表中包含一个“版本”ID,作为主键的一部分,并将 orderlines 表连接到 product_id 和 version。

      删除产品不应导致 SQL“删除”语句 - 相反,产品表应包含一个标志以指示该产品是否仍然可用。当产品变得不可用时,您将产品表中的旧记录设置为 now() 的 valid_until,并插入新行并将“availableFlag”设置为 false。

      【讨论】:

        猜你喜欢
        • 2021-10-17
        • 1970-01-01
        • 2019-02-02
        • 2012-04-10
        • 1970-01-01
        • 1970-01-01
        • 2021-05-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多