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

时间:2017-10-04 22:34:42

标签: database database-design relational-database relationship

好吧,也许这不是问题的最佳标题,但情况确实如此。

我正在开发一个已经拥有电子商务的项目。部分数据库看起来像这样。一切都很完美。

enter image description here

引用存在问题,如果用户购买产品时购物车已关闭,但如果产品被删除或价格发生变化,订单将完全损坏。

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

这样做的最佳方法是什么。大公司如何处理这个问题。 我的意思是我需要的是存储订单的所有细节以及购买时的数据。

3 个答案:

答案 0 :(得分:1)

有不同的方法可以解决这个问题。一种方法是具有价格历史表而不是定期更改的价格列。创建订单时,您可以按给定价格和给定产品创建订单。当您需要更改产品价格而不是更改价格列的值时,您可以在价格历史记录表中输入新记录,以便将来的订单可以采用新价格。另一种方法是将产品价格信息与订单分离。您可以在订单表中找到单价列,而不是从产品表中获取价格,并在那里保存价格的当前值。

就删除产品而言,这取决于您的情况。通常,删除历史信息所需的行不是一个好主意。因此,如果您不再想要销售产品,而不是删除记录,则可能会将产品的可用性设置为false。所以以前的订单仍然与该产品有关,但新订单无法添加。

答案 1 :(得分:0)

表格中每个字段的每个实例都应该与该表格的实例保持1:1的关系。 问题是价格与产品的关系是1:1,这很好。但它也应该与Cart有1:1的关系。并且,由于价格可能会随着时间的推移而改变,但事实并非如此 两种可能的解决方案:1)在购买时加上时间戳,并保留所有HistoricalPrices,然后在购买时选择合适的价格。这样做的好处是能够确切地说明价格变化的原因,但可以是额外的工作。 2)将PurchasePrice字段添加到Shopping_Cart_Products表。在购买时为该表的该实例分配PurchasePrice值。

答案 2 :(得分:0)

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

  1. 您更新购物车并通知用户原因。
  2. 您将所需的所有信息都放入购物车,并在结帐时使用,而不是实时产品数据。
  3. 解决方案1要求您在结账时至少进行一次完整性检查,以查看购物车是否仍然有效。解决方案2意味着人们可能会购买过时的产品。