数据库设计决策:规范化还是重复?

时间:2013-10-23 18:03:53

标签: postgresql optimization database-design

我正在建立一个交付系统,到现在为止,我的设计看起来像这样:

erd

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

hierarchy

问题在于,它会创建大量重复的StreetAddress,DeliveryPoint和Customer,因为每个行程都会创建很多,行程看起来非常像其他行程。 好的部分是只需几个连接就可以实现一切。

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

有关如何控制重复的任何想法,仍然可以轻松查询上述结构的架构?

我正在使用:

  • PostgreSQL 9.1
  • PHP 5.5
  • Symfony Framework Standard Edition 2.4.0-BETA1(With Doctrine)

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

1 个答案:

答案 0 :(得分:0)

重复和规范化并不总是相反的问题。

这是基本问题:

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

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

一个简单的方法是询问为什么给定的数据可能会发生变化的原因。良好的标准化设计限制了为什么给定的数据可能需要改变的原因。现在,考虑到这一点,看起来您需要为客户存储历史位置,并且在我看来,您可能希望做一些稍微不同的事情。

而不是:

Delivery -> customer -> street address -> itinerary

在我看来,它会更有意义:

Customer -> street address

delivery -> itinerary -> street address

在此模型中,您可能有重复的信息,您可能需要在街道地址中指明日期何时有效,但这不会影响我作为规范化问题,特别是考虑到已经解决的规范化问题姿势。但是从那里你可以很容易地跟踪交付的客户,而在你的模型中,你不清楚你可以跟踪给定交付的街道地址或行程。