Firebase 中最高效的投票系统
Most efficient voting system in Firebase
我正在开发一款应用程序,该应用程序允许用户上传图片并为彼此的图片评分(因此用 1-5 星投票)。但是我一直认为我正在构建的数据库系统效率不够高。希望有高手指点一下。
现在我有一个名为“图像”的数据库table。它具有以下字段:
- doc_id
- user_id
- 图片
- amount_of_votes
- 评分
每次用户投票时,amount_of_votes 都会获得 +1,评分的计算公式为(评分*旧票数 + 新票数)/新票数
但这给我带来了以下问题:
- 如果 2 个用户同时查看同一张图片(例如一张图片有 2 票和 1 颗星),那么如果第一个用户投了 5 颗星,则会计算新的评分。但是,如果第二个用户再次投票 1 星,那么最后一个投票的用户仍然会获得 2 票和 1 星,并且看不到新的 5 星评级。
- 另外我认为这样做不安全。理论上,用户可以将数量更改为 1,将评级更改为 1。
我想建立一个新的投票系统,其中有一个名为 votes 的新 table,它包含 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 数据库中,每当有人评价照片时,您可以增加当前计数。您可以在应用程序代码中实现上述公式,以便您的应用程序获取星星数量信息并使用上述公式计算平均值,然后显示它。
我正在开发一款应用程序,该应用程序允许用户上传图片并为彼此的图片评分(因此用 1-5 星投票)。但是我一直认为我正在构建的数据库系统效率不够高。希望有高手指点一下。
现在我有一个名为“图像”的数据库table。它具有以下字段:
- doc_id
- user_id
- 图片
- amount_of_votes
- 评分
每次用户投票时,amount_of_votes 都会获得 +1,评分的计算公式为(评分*旧票数 + 新票数)/新票数
但这给我带来了以下问题:
- 如果 2 个用户同时查看同一张图片(例如一张图片有 2 票和 1 颗星),那么如果第一个用户投了 5 颗星,则会计算新的评分。但是,如果第二个用户再次投票 1 星,那么最后一个投票的用户仍然会获得 2 票和 1 星,并且看不到新的 5 星评级。
- 另外我认为这样做不安全。理论上,用户可以将数量更改为 1,将评级更改为 1。
我想建立一个新的投票系统,其中有一个名为 votes 的新 table,它包含 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 数据库中,每当有人评价照片时,您可以增加当前计数。您可以在应用程序代码中实现上述公式,以便您的应用程序获取星星数量信息并使用上述公式计算平均值,然后显示它。