假设我有一个包含商店数字评级的数据库,我的应用程序需要能够读取商店的平均评分:
购物台: id(pk),name(varchar),average_rating(浮动 - 冗余列)
评分表: id(pk),rating_num(int),shop_id(int)
显然,最佳做法是简单地从评级表中重新计算平均评级以保持一致性;但是,从此应用程序的先前版本预计, 80%的查询将被读取以了解商店的平均评级。换句话说,写作评级将比阅读商店的平均评级要少得多。
如果我以这种方式构建我的数据库,我不需要额外的连接或查询来跳到评级表。这有什么警告吗?
答案 0 :(得分:1)
我会说这完全没问题,可能会节省一些读取流量,特别是如果你还需要查看商店名称。
您可能会在插入新评级的交易中更新平均评分。另一种方法是创建一个触发器来完成它。您更喜欢的是品味,因为所做的工作大致相同。
然后,您需要(shop_id, rating_num)
上的密钥才能有效计算商店的新平均评分(假设rating_num
是实际评分。)
答案 1 :(得分:1)
在Sql Server中解决此问题的最佳方法是使用Indexed View。 Oracle,PostgreSQL和MySql将它们称为物化视图。
索引视图可以自动为您保持平均评级数据的最新状态,而无需在表格中实际复制它。或者,数据仍然在视图中重复。不同之处在于您只需要告诉Sql Server这些数据是什么样的。你不需要管理自己保持最新状态。