【问题标题】:Database Design: How to prevent referential integrity violation? [closed]数据库设计:如何防止违反参照完整性? [关闭]
【发布时间】:2018-03-16 10:57:06
【问题描述】:
【问题讨论】:
标签:
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 意味着人们可能会购买有些过时的产品。