SQL复合属性和冗余

时间:2015-11-02 12:04:26

标签: sql postgresql

前提:我是SQL和数据库的新手。

我不明白的是:如果构建它们的所有组件都存储在数据库的其他属性中,那么复合属性是否被视为冗余?如果是,我是否仍然可以使用它们来避免昂贵的查询,即使这意味着在数据库中添加一些冗余?

作为一个例子:想象一下用户可以买卖物品的在线商店。表格是:

  • user(unique_id, name, money, ...)
  • transaction(seller_id, buyer_id, item_id, ...)
  • item(unique_id, price, ...)

现在,为了找到用户已经赚取的利润,我将用户已售出的所有商品的价格相加,并从中删除用户购买的所有商品的价格。 在伪代码中:

profits = SUM(sales) - SUM(purchases)

我在这个查询中看到的问题是,随着用户交易次数的增加,它会变慢。

为了加快速度,我可以简单地在user表中添加一个属性profits,每次用户进行交易时都会更新。{1}}它总是比总和和减去所有事务更快,但看起来它在数据库中引入了一些冗余,因为profits是一个复合值。我应该打扰一下吗?

1 个答案:

答案 0 :(得分:0)

全部取决于您的需求。你愿意做出妥协。你总是可以尝试两种解决方案,看看你是否有任何改进。

  • 您的原始查询在db中是标准的,我们将其称为规范化数据库。在相关字段上添加索引可以帮助您解决所有性能问题。
  • profits就是我们所说的计算字段。

    • 优点:将加快select陈述
    • 缺点:需要更多存储空间(在这种情况下最少),会减慢insert/update

对于您的情况,第一个解决方案是可以的,构建db来处理具有数百万行的配置的表而没有问题。

但是,例如在这种情况下,distance需要sincosradians

( 3959 * acos(cos(radians(' . $location_lat . '))' .
                '* cos( radians( s.latitude ) )' .
                '* cos( radians( s.longitude )' .
                '- radians(' . $location_lng . ') )' .
                '+ sin( radians(' . $location_lat . ') )' .
                '* sin( radians( s.latitude ) ) ) ) as distance'

如果计算selects一次因为这些函数非常慢,你会在distance中获得重大的性能提升。