1

我正在构建一个交付系统,到目前为止,我的设计如下所示:

erd

问题是,我经常需要一个看起来像这样的结构(数组、json、对象......)(非常分层):

等级制度

这样做的问题在于,它会创建大量重复的 StreetAddress、DeliveryPoint 和 Customer,因为每个行程都会创建很多这样的行程,而且行程看起来很像其他行程。好的部分是,只需几个连接,一切都会很漂亮。

使用第一个模式,创建第二个结构会很奇怪,但它是可能的。

关于如何控制重复并仍然获得上述结构的易于查询模式的任何想法?

我在用着:

  • PostgreSQL 9.1
  • PHP 5.5
  • Symfony Framework 标准版 2.4.0-BETA1(含 Doctrine)

[如果有人想知道我是如何绘制模式的:www.gliffy.com]

4

1 回答 1

0

重复和规范化并不总是对立的问题。

这是基本问题:

规范化不关心重复本身,而是关心功能依赖

重复是错误的问题。功能依赖是正确的问题。在您的某些情况下,地址非常难以确定功能依赖关系,因为那里有很多约定,即使您这样做了,您仍然会遇到格式问题。

了解这一点的一种简单方法是询问给定数据可能更改的原因。良好的规范化设计限制了给定数据可能需要更改的原因。现在,考虑到这一点,您似乎需要为客户存储历史位置,在我看来,您可能想做一些稍微不同的事情。

代替:

Delivery -> customer -> street address -> itinerary

在我看来,这样做更有意义:

Customer -> street address

delivery -> itinerary -> street address

在这个模型中,您可能有重复的信息,并且您可能需要在街道地址中包含日期,以表明它何时有效,但这并不会让我觉得这是一个规范化问题,特别是考虑到地址已经存在的规范化问题。但是从那里您可以轻松地跟踪送货的客户,而在您的模型中,您不清楚您是否可以跟踪给定送货的街道地址或行程。

于 2013-10-28T04:38:54.640 回答