存储送货地址最佳实践

Len*_*ton 7 mysql

我正在构建一个结帐系统,它需要将客户的送货地址存储在数据库中,但我不确定最好的方法。

目前我有一个地址表,它存储每个地址的唯一 ID:

id | address         | city     | division   | country | postcode
-----------------------------------------------------------------
1  | 23 Example Road | York     | Yorkshire  | GB      | PE21 5QR
2  | 7 Lala Land     | Stockton | California | US      | 96341
Run Code Online (Sandbox Code Playgroud)

然后我有一个称为 account_addresses 的多对多关系表,它将地址链接到用户帐户:

account_id | address_id
-----------------------
23         | 1
48         | 2
Run Code Online (Sandbox Code Playgroud)

为了将送货地址存储在数据库中,我将允许用户选择他们现有的地址之一,或者让他们向他们的帐户添加一个新地址并将该地址 ID 存储在订单表中。但是,我意识到如果我只存储地址 ID,如果用户编辑该地址,则会更改送货地址,从而导致错误。

我只看到两种解决方案:

  1. 将送货地址作为新行存储在地址表中,尽管这会复制已经存在的数据。
  2. 当用户编辑他们的地址时,它会插入一个新地址并将旧地址保留在数据库中,而不是更新数据。

什么是最好的解决方案,为什么?

Pie*_*ens 8

送货地址是每个订单的财产,而不是客户的财产。即使它是客户的财产,如果客户搬迁,也有必要知道过去的订单被运送到哪里。

因此,所有可以存储为 Customer 属性的是Default Shipping Address(和Default Billing Address),用于在创建每个订单和发票时预先填充它们。这不是非规范化,因为它直接反映和捕获所需的业务规则。

既然处理了历史会计记录,那么应该有一个 CustomerLocation 表,其中包含一个地址表中的三个地址记录: 物理地址;默认账单地址; 和默认送货地址。这些记录中的第一个应与 EffectiveDate 相关联,以便在发生更改时再次存在历史记录。