数据库优化订单

时间:2012-08-13 00:53:48

标签: database database-design

在用户可以下订单的数据库中,最好是有一个带地址的新表,或者每个订单的标题中都有地址数据。

4 个答案:

答案 0 :(得分:5)

一般来说,您很可能想要分开:

  • 用户
  • 地址
  • 订单信息

这是因为用户可以随时间更改地址,但需要保留旧地址,因为他们有针对它们的订单。此外,单个用户可以从同一地址获得多个订单,因此我们将这些信息分开以减少重复。

http://en.wikipedia.org/wiki/Database_normalization

答案 1 :(得分:5)

这不仅仅是关于用户(及其地址),还有关于您销售的产品的价格和其他信息,可以在强调订单后更改,但订单本身必须保留完好。

通常,有两种方法:

  1. 复制订单中所需的所有内容(及其项目)。即使“主”数据发生变化,您仍然可以使用您可以使用的订单中的副本。
  2. “版本”或“历史化”整个数据库,类似于this
  3. (1)是更“实用”的方法,但可能导致数据冗余(例如,当地址更改时,您仍然会单独复制它。)

    (2)是更“纯粹”的方法,但可能需要更多的JOIN,并且通常更复杂。

答案 2 :(得分:0)

我想不出地址与订单在同一个表格中的任何原因,除了它现在为您节省了少量工作。

拥有单独表格的参数包括:

  • 能够将多个交付地址与用户关联,而无需搜索所有订单(因此很容易为用户提供他们之前使用过的地址下拉列表)。

  • 您可以使用相同的表格进行结算和投放地址,避免重复

  • 您可以扩展/更改地址在未来的存储方式(例如,在您去国际时添加国家/地区字段),而无需更新每个订单。

这与优化无关。不知道为什么会出现在标题中?

[Branko对保留订单数据有一个很好的观点。但是,您不需要使数据库完全版本化。你可以简单地在订单引用的东西上有一个“过期”标志(比如用户和地址)但不再有当前值。换句话说,你只需要两个“版本” - 当前和历史。只要您在订单表中明确地引用(因此您不通过用户转到交付地址,而是直接从订单表链接到地址表,这可以使其工作。完全版本化数据库,包括人际关系,是一项很多工作。]

答案 3 :(得分:0)

不要重新发明轮子。订单系统已经存在很长时间,并且已经建立了最佳实践。您可以创建一个地址簿,以便您的联系人可以拥有多个地址。联系人具有零对多地址。但是,在发货时,请使用订单(或发货实体)保留地址的副本。将地址存储为订单中的时间点数据以保持准确的历史数据非常重要。 Magento,Shopify,Quickbooks所有主要的会计和电子商务系统都有这样的模型。 Saasu会计是一个例外。他们不会在订单中保留地址,因此您必须为每个订单创建一个新联系人,否则如果您修改了客户地址,则最终会在历史订单上重写该地址。一个非常可怕的设计!