2017-08-17 27 views
1

1から5までのスケールでユーザーを評価できる機能を持つアプリをビルドします。5つ星評価システムデータベースデザイン

Sum of (weight * number of reviews at that weight)/total number of reviews

Imは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) 

が、これは評価を格納するための最良の方法で、オブジェクトを初期化するために、実際の計算を行う、またはより効率的なデザインがありますか?ありがとう。

答えて

1

各ユーザーの評価を保存する必要があるため、この方法で評価を保存することをおすすめします。最終評価を計算するためとして

は、ここではより高度な実装である:

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) 

第2のアルゴリズム:評価の魔女の膨大な量に対処することができる別のアルゴリズムは、オーバーフローが発生する可能性があり

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) 

新しいユーザーが料金を請求するたびにサーバー側の評価を再計算すると効果的です(これらの評価に大量のユーザーがアクセスしている場合や、格付けが膨大な場合は、サーバー側でこれを計算することをお勧めします)。