我正在构建一个结帐系统,它需要将客户的送货地址存储在数据库中,但我不确定最好的方法。
目前我有一个地址表,它存储每个地址的唯一 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,如果用户编辑该地址,则会更改送货地址,从而导致错误。
我只看到两种解决方案:
什么是最好的解决方案,为什么?
送货地址是每个订单的财产,而不是客户的财产。即使它是客户的财产,如果客户搬迁,也有必要知道过去的订单被运送到哪里。
因此,所有可以存储为 Customer 属性的是Default Shipping Address(和Default Billing Address),用于在创建每个订单和发票时预先填充它们。这不是非规范化,因为它直接反映和捕获所需的业务规则。
既然处理了历史会计记录,那么应该有一个 CustomerLocation 表,其中包含一个地址表中的三个地址记录: 物理地址;默认账单地址; 和默认送货地址。这些记录中的第一个应与 EffectiveDate 相关联,以便在发生更改时再次存在历史记录。