【问题标题】:Database Design: How to prevent referential integrity violation? [closed]数据库设计:如何防止违反参照完整性? [关闭]
【发布时间】:2018-03-16 10:57:06
【问题描述】:

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

我正在从事一个已经拥有电子商务的项目。部分数据库看起来像这样。一切正常。

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

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

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

【问题讨论】:

  • 抱歉,我无法读取图形。

标签: database database-design relational-database relationship


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多