前提:我是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
是一个复合值。我应该打扰一下吗?
答案 0 :(得分:0)
全部取决于您的需求。你愿意做出妥协。你总是可以尝试两种解决方案,看看你是否有任何改进。
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
中获得重大的性能提升。