2012-08-13 187 views
0

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

+0

你正在使用哪种数据库? – c0deNinja 2012-08-13 00:56:16

+0

postgres sql db – 2012-08-13 00:57:44

回答

5

这不仅仅是用户(和它们的地址),但也对价格和你正在销售,可以订单后更改产品的其他信息被放置,然而为了本身必须保持不变。

一般来说,有2种方法是:您在订单(及其项目)需要

  1. 复制的一切。即使“主”数据发生更改,您仍然可以在可以使用的订单内有副本。
  2. “版本”或“历史”整个数据库,类似于this

(1)是更“实用”的方法,但可能会导致数据的冗余(例如,当地址变化,你仍然使得它的单独副本)。 (2)是更纯粹的方法,但可能需要更多的JOIN,并且通常会更复杂。

0

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

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

  • 能够与一个用户的多个送货地址,而不必通过所有订单搜索(关联,所以很容易向用户提供地址的下拉列表他们以前使用过)。

  • 您可以使用相同的表计费和送货地址,避免重复

  • 可以延长/更改地址是如何存储在未来的(例如,通过增加一个国家外地当你去国际),而不必更新每个订单。

这些都与优化无关。不知道为什么这是标题?

[Branko在保存订单数据方面有一个很好的观点。但是,您不需要使数据库完全版本化。您可以简单地在从订单引用的事物(如用户和地址)上拥有“过期”标志,但不再具有当前值。换句话说,你只需要两个“版本” - 当前和历史。只要您在订单表中显式引用参考资料(因此您不需要通过用户访问交付地址,而是直接链接到订单表中的地址表,可以使其工作。完全版本化数据库,包括关系,是很多工作]

+0

由于地址是真正的时间点数据;也就是说,这是订单发货的记录,将发货地址存储在具有1对1关系的单独表格中的优点是什么?此外,为什么有一个过期的领域,当你只是查询,看看订单是否发货?如果您以这种方式设计,您需要额外的触发器或其他东西来确保您的“过期”标志与订单状态保持一致。总的来说,我认为这会产生比解决问题更多的问题。 – 2014-06-16 03:20:27

5

一般来说,你将最有可能要分开。

  • 用户
  • 地址
  • 订货信息

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

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

0

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