如果我期望更多的读取而不是写入,那么SQL中的冗余列是否有益?

时间:2015-07-04 22:28:19

标签: sql database performance scalability database-performance

假设我有一个包含商店数字评级的数据库,我的应用程序需要能够读取商店的平均评分:

购物台: id(pk),name(varchar),average_rating(浮动 - 冗余列)

评分表: id(pk),rating_num(int),shop_id(int)

显然,最佳做法是简单地从评级表中重新计算平均评级以保持一致性;但是,从此应用程序的先前版本预计, 80%的查询将被读取以了解商店的平均评级。换句话说,写作评级将比阅读商店的平均评级要少得多。

如果我以这种方式构建我的数据库,我不需要额外的连接或查询来跳到评级表。这有什么警告吗?

2 个答案:

答案 0 :(得分:1)

我会说这完全没问题,可能会节省一些读取流量,特别是如果你还需要查看商店名称。

您可能会在插入新评级的交易中更新平均评分。另一种方法是创建一个触发器来完成它。您更喜欢的是品味,因为所做的工作大致相同。

然后,您需要(shop_id, rating_num)上的密钥才能有效计算商店的新平均评分(假设rating_num是实际评分。)

答案 1 :(得分:1)

在Sql Server中解决此问题的最佳方法是使用Indexed ViewOraclePostgreSQL和MySql将它们称为物化视图

索引视图可以自动为您保持平均评级数据的最新状态,而无需在表格中实际复制它。或者,数据仍然在视图中重复。不同之处在于您只需要告诉Sql Server这些数据是什么样的。你不需要管理自己保持最新状态。