在用户可以下订单的数据库中,最好有一个带有地址的新表,还是每个订单的标题中都有地址数据。
4 回答
一般来说,您很可能想要分开:
- 用户
- 地址
- 订单信息
这是因为用户可以随着时间的推移更改地址,但需要保留旧地址,因为他们有针对他们的命令。另外,一个用户可以从同一个地址有多个订单,因此我们将这些信息分开以减少重复。
这不仅与用户(及其地址)有关,还与您所销售产品的价格和其他信息有关,这些信息在下订单后可能会发生变化,但订单本身必须保持不变。
通常,有两种方法可以解决此问题:
- 复制订单中所需的所有内容(及其项目)。即使“主”数据发生变化,您仍然可以使用订单中的副本。
- “版本”或“历史化”整个数据库,与此类似。
(1) 是更“实用”的方法,但可能会导致数据冗余(例如,当地址不变时,您仍然会制作它的单独副本)。
(2) 是更“纯粹”的方法,但可能需要更多的 JOINing 并且通常更复杂。
我想不出任何理由让地址与订单在同一个表中,只是它现在可以为您节省少量工作。
有一个单独的表的论据包括:
能够将多个送货地址与用户相关联,而无需搜索所有订单(因此很容易为用户提供他们以前使用过的地址的下拉列表)。
您可以将同一表用于帐单和收货地址,避免重复
您可以扩展/更改将来存储地址的方式(例如,在您走向国际时添加国家/地区字段),而无需更新每个订单。
这些都与优化无关。不知道为什么在标题中?
[Branko 关于保留订单数据有一个很好的观点。但是,您不需要使数据库完全版本化。您可以简单地在从订单中引用但不再具有当前值的事物(例如用户和地址)上设置一个“过期”标志。换句话说,您只需要两个“版本”——当前版本和历史版本。只要您在订单表中明确引用(因此您不会通过用户转到交货地址,而是直接从订单表链接到地址表,这可以使其工作。完全版本控制数据库,包括关系,是很多工作。]
不要重新发明轮子。订单系统已经存在了很长时间,并且已经建立了良好的最佳实践。您可以创建一个地址簿,以便您的联系人可以拥有多个地址。联系人具有零对多地址。但是,在发货时,请务必将地址副本保留在订单(或发货实体)中。为了维护准确的历史数据,将地址存储为时间点数据非常重要。Magento、Shopify、Quickbooks 所有主要的会计和电子商务系统都有这样的模型。Saasu 会计是一个例外。他们不会将地址与订单一起保存,因此您必须为每个订单创建一个新联系人,否则如果您修改了客户地址,您最终会在历史订单上重写地址。一个非常糟糕的设计!