postgresql - 数据库设计决策 : normalization or repetition?

标签 postgresql optimization database-design

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

erd

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

hierarchy

这样做的问题是,它会产生大量重复的 StreetAddress、DeliveryPoint 和 Customer,因为每个 Itinerary 都会创建很多这样的信息,而且行程看起来与其他的非常相似。 好的部分是,只需几个连接,一切都会很漂亮。

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

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

我正在使用:

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

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

最佳答案

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

这是基本问题:

规范化本身不关心重复,而是关心函数依赖

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

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

代替:

Delivery -> customer -> street address -> itinerary

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

Customer -> street address

delivery -> itinerary -> street address

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

关于postgresql - 数据库设计决策 : normalization or repetition?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19549120/

相关文章:

PostgreSQL 演变 : "PSQLException: FATAL: sorry, too many clients already"

c - 确定设置了字节中的哪一位

php - 如何在mysql中存储顺序数据

node.js - NodeJS如何只在工作时间执行一个功能?

ruby-on-rails - 数据库迁移脚本中断引用

python - 如何自动生成项目id编号?

mysql - 优化表的简单更新

python - Python 上的 Gurobi 优化器

mysql - 您可以将现有表添加到 MySQL Workbench 中的现有模型吗?

c# - System.Data.Common.DbCommand : Parameterized Query as Procedure Parameter?