哪个更好计算星级平均值(在性能意义上)

Posted

技术标签:

【中文标题】哪个更好计算星级平均值(在性能意义上)【英文标题】:which one is better to calculate star rating average (in performance sense) 【发布时间】:2017-04-29 11:19:25 【问题描述】:

我想哪一个是显示平均星级的最佳方式。当有给出星值的评论时计算平均值是否更好,并将平均值存储在 DB 字段中,所以当我加载页面时,我只检查 1 个字段的值?还是计算用户每次加载页面的平均值?

【问题讨论】:

【参考方案1】:

如果没有示例架构和典型用法的概念,几乎不可能提供一个好的答案。

您提出的问题是“我应该对我的数据库进行非规范化吗” - 关于这个主题有 lots 和 other questions。

从性能的角度来看,问题归结为“你需要多久写一次,多久读一次,数据的一致性有多重要?”。

如果您的应用程序用户体验几乎从不显示“星级”,并且计算该星级“便宜”,则性能影响很小。

如果您要显示包含项目的长滚动页面,每个页面都有星级,性能优势可能会很高,尤其是在计算星级是一项昂贵的操作时。

如果星级评分在所有情况下都准确无误很重要,您将不得不添加一些额外的逻辑,例如可能对您的数据库产生巨大影响的锁定行为。

如果您的应用程序经验意味着您可能有非常多的新评级时间段,那么您可能会对“写入”操作产生重大的性能影响。

一般来说,最好将您的应用程序设计为规范化(因此易于调试和维护),并衡量您是否需要做更多的事情。现代数据库引擎的处理能力远远超出大多数人的想象。

** 更新**

感谢您的更新。

您的架构建议应该在没有非规范化的情况下闪电般快速 - 您应该加入 reviews 表上的外键。这一切都取决于具体情况,但除非您需要扩展到数以亿计的产品和评论,否则我怀疑您是否会在数据库性能方面看到可衡量的差异。保持“平均分数”列更新的逻辑可能比动态计算更多的性能开销。

根据我的经验,非规范化是一件昂贵的事情 - 它使您的代码更难理解和调试,并导致有趣的错误。从性能的角度来看,如果您正在构建一个网站,那么通过专注于 HTTP 级别的缓存,您将获得更好的回报。

【讨论】:

嗨 neville,我计划有 products 表和 reviews 表,其中 product_id 作为外键,在评论表中,有评级字段,产品页面将显示平均评级其中。我想读操作会比写操作高很多。这就是为什么我想在产品表中创建average_rating 字段。在这种情况下,评论的评分和这个 average_rating 之间的一致性并不是那么重要

以上是关于哪个更好计算星级平均值(在性能意义上)的主要内容,如果未能解决你的问题,请参考以下文章

有没有更好的方法来计算中位数(不是平均值)

c++中 求 平均值是哪个函数

计算平均值时性能不佳

计算多组数据的平均值(性能问题)

未定义的方法“平均”

21 | 高性能负载均衡:算法