1

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

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

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

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

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

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

4

2 回答 2

2

我已经建模ProductsOrders并且OrderItems以类似的方式;我必须添加到@Neville K 的答案的唯一一件事是,我之前已经ProductPrices根据自己的权利创建了域实体;Product毕竟,添加新价格与添加新价格不同。AProductPrice有价格、货币以及开始和结束日期;像这样的模型价格还可以为特定客户提供特定组的价格或折扣。

于 2012-12-06T10:38:02.783 回答
1

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

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

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

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

于 2012-12-06T10:21:57.367 回答