2017-08-17 3 views
1

Im Bau einer App, die eine Funktion haben wird, mit der Sie Benutzer auf einer Skala von 1-5 bewerten können. Ich habe bereits entschieden, ich werde wie so ein gewichtetes Mittel verwenden:5 Sterne System-Datenbank Design

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

Im Mühe, herauszufinden, wie diese Daten speichern Feuerbasis verwenden, da ich diese Bewertung Wert benötigen ein User Objekt zu initialisieren . Ich dachte daran, jede Bewertung als ein Wörterbuch zu speichern, in dem der Schlüssel id des Benutzers ist, der die Bewertung verlässt, und der Wert ist die tatsächliche Bewertung. Dann, nachdem ich Benutzer aus der Datenbank holen und müssen User initialisieren ich folgendes:

// 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) 

Ist dies der beste Weg Bewertungen zu speichern und tun eigentliche Berechnung Objekt zu initialisieren, oder gibt es eine effizientere Gestaltung? Vielen Dank.

Antwort

1

Sie müssen wahrscheinlich die Bewertung jedes Benutzers speichern, also ist es in Ordnung, Bewertungen auf diese Weise zu speichern.

Wie für die endgültige Bewertung zu berechnen, ist hier eine bessere Umsetzung:

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) 

Ein anderer Algorithmus, der mit riesigen Menge der Bewertungen Hexe umgehen kann zu Überlauf führen könnte:

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) 

Der zweite Algorithmus funktioniert gut, wenn Sie die Bewertungen auf der Serverseite jedes Mal neu berechnen, wenn ein neuer Nutzer Bewertungen erstellt (für den Fall, dass eine große Anzahl von Benutzern auf diese Bewertungen zugreifen, und auch große Mengen an Bewertungen, ist es besser, dies auf der Serverseite zu berechnen).

Verwandte Themen