我们在为新应用程序建模数据时遇到了困境。情况有点复杂;所以我写下了一个与我们的问题相同的简化情况:
在网络应用中,管理员会创建产品列表;标题,描述,与某些产品类别相关联;等所以有一个产品实体
在前端,用户订购某些产品;所以有一个Order实体,其中包含与之关联的OrderLine实体数组;每个OrderLine权利都有一个与之关联的产品。
几天后,订购了多个产品。然而,管理员需要更改产品的价格,甚至删除产品,因为它已不再可用。
在数据库中,仍然存在与OrderLines关联的订单,这些订单链接到Products。当管理员检查数据库中的订单时会发生什么?在产品在数据库中被更改之前记录并且与被更改的产品相关联?
尽可能避免冗余;在数据库级别,你会如何模拟这种情况?
答案 0 :(得分:2)
我以类似的方式对Products
,Orders
和OrderItems
进行了建模;我唯一需要补充的是@Neville K的回答是我之前已经创建了ProductPrices
域实体;毕竟,添加新价格与添加新Product
不是一回事。 ProductPrice
有价格,货币以及开始和结束日期;这样的建模价格也可以为特定客户提供特定于集团的价格或折扣。
答案 1 :(得分:1)
我用于此问题的解决方案是将对“Product”的更改记录为一流的域概念。通常,这意味着在订单表中包含“valid_from”和“valid_until”字段,并通过将当前记录的“valid_until”日期设置为now()并使用now_from of now插入产品的新行来记录更改( )和null valid_until。
这允许您的订单检索订单创建时的产品信息,这反过来允许您的业务逻辑推理该数据 - 尊重订单创建时的价格,例如。
另一种方法是在产品表中包含“版本”ID,作为主键的一部分,并将订单行表连接到product_id和版本。
删除产品不应该导致SQL“删除”语句 - 相反,Products表应该包含一个标志,以指示产品是否仍然可用。当产品不可用时,您将product表中的旧记录设置为valid_until为now(),并插入一个新行,其中“availableFlag”设置为false。