2017-03-06 15 views
2

Ich versuche eine unendliche Scroll für Beiträge, die Rankings (ähnlich HackerNews) haben, zu erstellen, und ich frage mich, was die effizienteste Möglichkeit wäre, endlos Scrollen zu paginieren/erstellen mit Firebase, wenn eine große Datenmenge vorhanden ist.Der effizienteste Weg, um große Datenmengen in Firebase zu paginieren

Der Weg, den ich getan habe, ist, dass ich alle Daten anfordere, sortiere sie und begrenze dann die Rolle, um ein unendliches Rollengefühl zu schaffen. Gibt es eine Möglichkeit, diese unendliche Schriftrolle zu erstellen, ohne alle Daten anzufordern und sie dann zu sortieren?

Das Problem, das ich mit dieser Methode sehe, ist, dass, wenn wir 100K + Einträge haben, wir 100K + Einträge anfordern und sortieren müssten, und das wäre nicht nett. Jede Hilfe würde sehr geschätzt werden!

Antwort

2

Da das Ranking ein berechneter Wert ist, der von der Zeit seit der Erstellung des Posts und der Punktzahl eines Posts abhängt, haben Sie wirklich nur zwei Möglichkeiten. Sie können entweder alle Beiträge erhalten und die Rankings clientseitig berechnen (was in Ihrem Fall keine Option ist) oder Sie können die Rankings berechnen, wenn ein Update auf den Post gemacht wird. Außerdem gebe ich meine Beispiele in Swift.

Struktur des DB für dieses Beispiel:

posts : { 
    $post: { 
    stats : { 
     score : scoreValue, 
     ranking : rankingValue, 
     createdAt : timestamp 
    } 
    } 
} 

Konkret bedeutet dies, dass, wenn eine neue Nachricht erstellt wird Sie es den Standard Punktzahl vergeben werden und das Ranking errechnen.

Da die Rangliste nun in der Datenbank gespeichert ist, können Sie einfach die oben x Beiträge holen, indem Sie

postsRef.queryOrdered(byChild:"stats/ranking").queryLimited(toLast: x) 

oder vielleicht

ref.queryOrdered(byChild: "stats/ranking").queryEnding(atValue: "lowestScoreSoFar").queryLimited(toLast: x) 

Nun, um sicherzustellen, dass ein Post-Ranking bleibt bis zu Datum können Sie einfach das Ranking in der gleichen Operation (Transaktion) aktualisieren, wo Sie die Punktzahl aktualisieren.

ref.runTransactionBlock({ (currentData: FIRMutableData) -> FIRTransactionResult in 
    if var stats = currentData.value as? [String : Any] { 
    var score = stats["score"] as? Int 
    var createdAt = stats["createdAt"] as? Long 
    score += 1 
    var ranking = calculateRanking(score, createdAt) 
    stats["score"] = score 
    stats["ranking"] = ranking 
    currentData.value = stats 
    return FIRTransactionResult.success(withValue: currentData) 
    } 
    return FIRTransactionResult.success(withValue: currentData) 
}) { (error, committed, snapshot) in 
    if let error = error { 
    print(error.localizedDescription) 
    } 
} 

Ein Problem bei diesem Verfahren ist die Tatsache, dass ein Beitrag mit einer hohen Punktzahl halten, wenn niemand Stimmen auf sie oben schwimmen. Um mit dieser Hacker News fertig zu werden, scheint auf ihrem Server ein Skript zu laufen, das alle 30 Sekunden das Ranking eines zufälligen Posts in der obersten x aktualisiert. Sie müssten einen Server ausführen und sehen, welche Einstellung für Ihren speziellen Fall am besten geeignet ist.

Da die Bewertung aller Beiträge sich bis zum Erreichen von 0 entwickeln wird, wenn Sie einen ähnlichen Algorithmus wie Hacker News verwenden, können Sie versuchen, die Rangfolge von Beiträgen mit einem Rang oberhalb einer bestimmten Schwelle nach dem Zufallsprinzip zu aktualisieren ältere und irrelevante Beiträge ignorieren).

Hacker News Algorithm

More info on the algorithm

How often does Hacker News recalculate rankings

How Hacker News algorithm really works

+0

Dank @Pieter Laebens für deine Antwort. Ich habe über diese Methode nachgedacht. Wenn meine Punkte jedoch nur Rohpunkte sind und ich die Beiträge basierend auf Rankings paginieren möchte, da das Ranking auch mit der Zeit korreliert ist (ältere Posts erhalten niedrigere Rankings), wie soll ich diese Daten paginieren? – ndduong

+0

Wird die Punktzahl wie eine Transaktion erhöht oder wird diese auch berechnet? –

+0

Wie auch immer, ich habe meine Antwort aktualisiert. –

Verwandte Themen