ios - 5星级评级系统数据库设计

标签 ios swift algorithm rating

我正在构建一个应用程序,该应用程序将具有允许您按 1 到 5 的等级对用户进行评分的功能。我已经决定使用加权平均值,如下所示:

总和(权重 * 该权重下的评论数)/评论总数

我无法弄清楚如何使用 firebase 存储这些数据,因为我需要这个评级值来初始化 User 对象。我考虑将每个评级存储为字典,其中键是留下评论的用户的 id,值是实际评级。然后,在我从数据库获取用户并需要初始化 User 后,我执行以下操作:

    // keep track of amount of each rating. 
    var oneStars = 0
    var twoStars = 0
    var threeStars = 0
    var fourStars = 0
    var fiveStars = 0

    // iterate through dictionary of ratings where key is unique Id, and value is star rating.
    for (key, value) in ratings {
        switch value {
        case 1: oneStars += 1
        case 2: twoStars += 1
        case 3: threeStars += 1
        case 4: fourStars += 1
        case 5: fiveStars += 1
        }
    }

    let weightedSum = (
        (5 * fiveStars) +
        (4 * fourStars) +
        (3 * threeStars) +
        (2 * twoStars) +
        (1 * oneStars)
    )

    let reviewsSum = oneStars + twoStars + threeStars + fourStars + fiveStars

    let rating = weightedSum / reviewsSum

    let user = User(name: "john doe", rating: rating)

这是存储评级并进行实际计算来初始化对象的最佳方式,还是有更有效的设计?谢谢。

最佳答案

您可能需要存储每个用户的评分,因此以这种方式存储评分就可以了。

对于计算最终评分,这里有一个更好的实现:

var count = 0
var rating = 0

for (key, value) in ratings {
    count += 1
    rating += value
}

rating /= count

let user = User(name: "john doe", rating: rating)

另一种可以处理大量评级的算法可能会导致溢出:

var count = 0
var rating = 0

for (key, value) in ratings {
    count += 1
    rating += (value - rating) / count
}

let user = User(name: "john doe", rating: rating)

如果每次新用户评分时都在服务器端重新计算评分,则第二种算法效果很好(如果您有大量用户访问这些评分,并且还有大量评分,最好在服务器端)。

关于ios - 5星级评级系统数据库设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45727487/

相关文章:

algorithm - 毛毛虫和叶子。我们可以做得比O(n * c)好吗?

ios - Swift3 - Init 的使用不明确

ios - 为什么此代码示例在返回之前进行复制?

ios - Swift CoreData 模型有帮助吗? (给出的例子)

swift - 警告 : CoreAnimation stiffness must be greater than 0, 但我使用 viewAnimation

algorithm - 如何在 O(logn) 时间内找到 5 个排序列表的中位数?

ios - MKMapSnapshotOptions : Adding snapshot of Custom Pin Annotation View or UIView

objective-c - 从动态但固定大小的数组计算平均值.. Objective-C 还是 C?

json - 如何将嵌套的 JSON 数组解析为 Codable 结构

查找字符串 A 需要声明多少次才能包含字符串 B 作为子字符串的算法