繁体   English   中英

Firebase 中最高效的投票系统

[英]Most efficient voting system in Firebase

我正在开发一个应用程序,它允许用户上传图片并为彼此的图片评分(所以用 1-5 颗星投票)。 但是我一直认为我正在构建的数据库系统不够高效。 我希望有人可以给我建议。

现在我有一个名为“图像”的数据库表。 它有以下字段:

  • 文档 ID
  • 用户身份
  • 图像
  • 票数
  • 评分

每次用户投票时,amount_of_votes 都会获得 +1,并且评分的计算公式为(评分*旧票数 + 新票数)/新票数

但这给了我以下问题:

  • 如果 2 个用户同时查看同一张图片(例如,一张图片有 2 票,1 星),那么如果第一个用户投票 5 星,则会计算新的评分。 但是如果第二个用户再次投票给 1 星,那么最后一个投票的用户仍然获得 2 票,1 星,并且看不到新的 5 星评级。
  • 我也认为这样做是不安全的。 理论上,用户可以将数量更改为 1,将评级更改为 1。

我想构建一个新的投票系统,其中有一个名为 votes 的新表,它保存 user_id 和用户提供的投票。 但这给了我以下问题:

  • 如果用户点击了一个非常受欢迎的图片,则必须加载大量投票并计算平均值。 那效率不高。

有谁知道我可以使用的最佳系统是什么? 我在互联网上花了几天时间,但我还没有找到最好的系统......

我没有尝试自己实现它,但我的方法是使用Snapshot listener

它可以帮助您在文档中发生变化时更新应用程序中的信息。 我使用的投票系统是分别收集 5 颗星、4 颗星、3 颗星等。 例如:用户获得了多少 5 星评级,用户获得了多少 4 星等。 然后,为了计算平均评分,我使用以下公式:

((no_of_votes_for_5stars * 5) + (no_of_votes_for_4stars * 4) + (no_of_votes_for_3stars * 3) + (no_of_votes_for_2stars * 2) + (no_of_votes_for_1star * 1)) / (no_of_votes_for_5stars +no_of_votes_for_4stars + no_of_votes_for_3stars + no_of_votes_for_2stars + no_of_votes_for_1star )

您可以在 Firestore 数据库中单独保存星级数据,并且每当有人对照片进行评分时,您都可以增加当前计数。 您可以在应用程序代码中实现上述公式,以便您的应用程序获取星数信息并使用上述公式计算平均值,然后将其显示出来。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM