【问题标题】:Database optimization orders数据库优化订单
【发布时间】:2012-08-09 06:08:56
【问题描述】:

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

【问题讨论】:

  • 你在使用什么样的数据库?

标签: database database-design


【解决方案1】:

这不仅与用户(及其地址)有关,还与您所销售产品的价格和其他信息有关,这些信息可能会在下订单后发生变化,但订单本身必须保持不变完好无损。

一般来说,有两种方法:

  1. 复制订单中所需的所有内容(及其项目)。即使“主”数据发生变化,您仍然可以使用订单中的副本。
  2. “版本”或“历史化”整个数据库,类似于this

(1) 是更“实用”的方法,但会导致数据冗余(例如,当地址没有改变时,您仍然会对其进行单独的复制)。

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

【讨论】:

    【解决方案2】:

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

    • 用户
    • 地址
    • 订单信息

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

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

    【讨论】:

      【解决方案3】:

      我想不出任何理由让地址与订单在同一个表中,只是它现在可以为您节省少量工作。

      有一个单独的表的论据包括:

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

      • 您可以使用同一张表记录帐单地址和收货地址,避免重复

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

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

      [Branko 关于保留订单数据有一个很好的观点。但是,您不需要使数据库完全版本化。您可以简单地在从订单中引用但不再具有当前值的事物(如用户和地址)上设置一个“过期”标志。换句话说,您只需要两个“版本”——当前版本和历史版本。只要您在订单表中显式引用(因此您不会通过用户转到交货地址,而是直接从订单表链接到地址表,这可以使其工作。完全版本控制数据库,包括人际关系,都是很多工作。]

      【讨论】:

      • 由于地址是真正的时间点数据;也就是说,它是订单发货地点的记录,将发货地址以一对一的关系存储在单独的表中有什么好处?另外,当您可以查询订单是否已发货时,为什么还要有一个过期字段?如果您以这种方式设计它,您需要一个额外的触发器或其他东西来确保您的“过期”标志与订单状态保持一致。总的来说,我认为这带来的问题多于解决的问题。
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-12-14
        • 2012-07-20
        • 2010-12-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多