数据库设计:如何防止违反参照完整性?

Database Design: How to prevent referential integrity violation?

好吧,也许这不是问题的最佳标题,但就是这样。

我正在做一个已经有 e-commerce 的项目。数据库的一部分看起来像这样。一切正常。

问题出在参考文献上,如果用户购买产品,购物车会关闭,但如果随后产品被删除或价格发生变化,订单就会完全损坏。

我已阅读此文字 -> Database Design for Real-World E-Commerce Systems 但我在这里看不到解决方案。

最好的方法是什么。大公司如何处理这个问题。 我的意思是我需要的是用购买时的数据存储订单的所有详细信息。

有多种方法可以解决这个问题。一种方法是使用价格历史记录 table 而不是定期更改的价格列。当您创建订单时,您会为给定的价格和给定的产品创建订单。当您需要更改产品价格时,您无需更改价格列的值,而是在您的价格历史记录中输入一条新记录 table,这样以后的订单就可以采用新价格。另一种方法是将产品价格信息与订单分离。您没有从产品 table 中获取价格,而是在订单 table 中有一列单价,并且价格的当前值保存在那里。

至于删除商品,还是要看你的情况。通常,删除历史信息所需的行不是一个好主意。因此,如果您不想再销售产品,而不是删除记录,您可以将产品可用性的列设置为 false。因此,之前的订单仍将与该产品相关,但新订单将无法添加该产品。

table 中每个字段的每个实例都应该与 table. 的那个实例有 1:1 关系 问题是 Price 与 Product 有 1:1 关系,这很好。但它也应该与购物车有 1:1 关系。而且,由于价格会随时间变化,所以不会。
两种可能的解决方案:1)在购买上放置时间戳,并保留所有历史价格,然后 select 购买时的正确价格。这样做的好处是能够准确说明价格变化的原因,但可能需要额外的工作。 2) 在 Shopping_Cart_Products table 中添加一个 PurchasePrice 字段。在购买时为 table 的那个实例分配 PurchasePrice 值。

如果产品在购物车中时发生变化,您有几个选择:

  1. 您更新购物车并通知用户原因。
  2. 您将所需的所有信息放入购物车并在结账时使用这些信息而不是实时产品数据。

解决方案 1 要求您在结帐结束时至少 进行一次完整性检查,以查看购物车是否仍然有效。解决方案 2 意味着人们可能会购买过时的产品。