SQL复合属性和冗余
问题描述:
前提:我是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
是一个复合值。我应该打扰吗?
答
全部取决于你的需要。而你愿意做的妥协。你总是可以尝试两种解决方案,看看你是否有任何改进。
- 您的原始查询是标准的分贝,我们称之为标准化数据库。在相关领域添加索引帮助了很多,并将解决您的所有性能问题。
-
profits
就是我们所说的计算场。- 优点:将加快
select
声明 - 缺点:需要更多的存储(在这种情况下最小的),将减缓
insert/update
- 优点:将加快
对于你的情况,第一个解决方案是好的,DB是构建以处理具有百万行而没有问题的配置的表。
但是例如在这种情况下,其中distance
需要sin
,cos
和radians
。
(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
一次,因为这些功能是非常慢的。
你正在使用哪个dbms? (其中一些有“计算”栏。) – jarlh
在发布答案之前,请您澄清一下。你抱怨性能(然后我建议你使用索引)或反规范化(添加额外的列)? – Dewfy
@jarlh我正在使用PostgreSQL – cei