database - 如何让用户更改地址而不影响订单中的同一个地址?

标签 database database-design erd domain-model

我希望每个订单都有一个送货地址。但是,如果我在 order 表中添加 shipping_addresss_id ,那么如果用户订购了已发货并交付的商品,并且几个月后用户将其送货地址更改为其他地址,那么几个月前已经处理过的订单也将更改为新地址,从而导致结果伪造。如果他/她完全删除该地址,也会引起问题。

我想到了这个解决方案: 每当用户订购时,我都会向他/她提供 shipping_address 表中的所有 地址,用户将选择一个,而不是指向 shipping_address_id ,我将获取 address 的硬字符串并将其保存在订单中。这是一个好的解决方案吗?

这是我当前 ERD 中的相关部分:

enter image description here

这是全部database

最佳答案

事实上,客户可以为新订单选择的当前可能送货地址列表与用于送货的历史地址之间存在差异,一旦包裹离开仓库,历史地址就无法更改。

解决这个问题主要有以下三种方法:

  1. 非规范化:在订单中包含必填地址字段,一旦订单处于发货状态(例如“准备提货”或“已提货”),就不再更改它由承运人”)。填充此发货订单地址的最简单方法似乎是在状态更改时复制有效的发货地址。

    优点:

    • 易于实现和使用,不影响(所需)送货地址的管理。

    缺点:

    • 订单将包含与不同问题相对应的信息,这使得维护变得困难:如果地址格式发生变化,您还必须更改订单实体。
    • 该订单将包含大量冗余地址。
    • 此外,您可能有重复的代码,因为显示有效送货地址的执行方式与所需的送货地址不同。
  2. 为有效订单送货地址添加“shipping_address”实体:您只需在此处存储送货时使用的地址以及与相关订单的关系。

    优点和缺点:它通过将地址隔离在单独的表中,在一定程度上减少了第一个选项的缺点,但非常相似。

  3. 智能送货地址管理:重新思考送货地址的使用方式。您的订单还应注明送货地址。在这种情况下,您必须确保已发货订单中使用的送货地址不再更改(例如使用标记)。如果客户的地址发生变化并且当前地址是此类标记地址,则您需要创建一个新地址而不是现有地址。由于客户可能有多个所需的送货地址,因此您还需要考虑客户是否仍想使用历史地址。

    优点:

    • 确保非规范化并防止冗余地址
    • 只要没有订单有效运送到该地址,就可以在一个地方更新送货地址
    • 保留已发货订单的送货地址
    • 无论是历史地址还是真实地址,部署送货地址的方式始终相同。

    缺点:

    • 需要更仔细地管理送货地址。

结论:我建议选择选项 3。它要求您更多地考虑送货地址和地址状态,但最终会产生更强大的解决方案。

关于database - 如何让用户更改地址而不影响订单中的同一个地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75230815/

相关文章:

sql - Sage 200 - 计数器表而不是标识列 - 奇怪的行为

ruby-on-rails - 橄榄球运动员的 Rails 模型关系

mysql - 如何在ERD模型中为产品创建类别?

database - 在 ERD 中绘制多对多关系

sql-server - SSIS:当我使用 foreach 语句循环遍历记录集时,我可以编辑记录集吗?

mysql - 多条记录的最后 5 条相关记录

数据库设计: accounts with multi currency

mysql - 需要 ERD 帮助 错误跟踪系统 图片已附

mysql - MariaDB 不会创建以大 VARCHAR 作为主键的表

objective-c - sqlite3 没有链接到我的 IOS 项目