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