2015-11-02 44 views
0

前提:我是SQL和数据库的新手。SQL复合属性和冗余

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

举个例子:设想一个网上商店,用户可以购买和出售物品。该表是:

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

现在,找到的用户已作出我总结用户已售出的所有商品的价格,从取出的利润它是用户购买的所有产品的价格。 伪代码:

profits = SUM(sales) - SUM(purchases)

我该查询看到的问题是,它会为取得了用户变得更大交易的数量更慢。

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

+0

你正在使用哪个dbms? (其中一些有“计算”栏。) – jarlh

+0

在发布答案之前,请您澄清一下。你抱怨性能(然后我建议你使用索引)或反规范化(添加额外的列)? – Dewfy

+0

@jarlh我正在使用PostgreSQL – cei

回答

0

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

  • 您的原始查询是标准的分贝,我们称之为标准化数据库。在相关领域添加索引帮助了很多,并将解决您的所有性能问题。
  • 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一次,因为这些功能是非常慢的。