2016-09-26 2 views
11

Wenn ein Knoten 100 Millionen Kinder hat, wird es eine Auswirkung auf die Leistung, wenn ich:Firebase-Leistung: Wie viele Kinder pro Knoten?

a) Abfrage, aber Grenze 10 Ergebnisse

b)

nur eines der Kinder beobachten

ich konnte Teilen Sie die Daten in mehrere Eltern auf, aber in meinem Fall werde ich einen Verweis auf das Kind haben, so kann ich es direkt nachschlagen (was die Komplexität reduziert). Wenn es Auswirkungen hat, wie hoch ist die maximale Anzahl für jedes Szenario, bevor die Leistung beeinträchtigt wird?

+2

Sie sollten lesen Sie https://firebase.google.com/docs/database/web/structure-data –

+1

Und auch https://firebase.google.com/docs/database/web/retrieve-data – Kato

+1

I hatte ein ähnliches Problem (Präsentation einer großen Liste in einem RecyclerView), siehe hier: http://stackoverflow.com/questions/36401332/firebase-android-offline-performance Sie können meine Lösung hier finden: http://stackoverflow.com/a/37772597/6155664 – Niels

Antwort

12

Wenn ein Knoten so viele Kinder hat, ist der Zugriff auf den Knoten in irgendeiner Weise ein Rezept für Probleme. Der Zugriff auf ein einzelnes Kind ist nie ein Problem.

Das Abfragen des Knotens für eine Teilmenge seiner untergeordneten Elemente erfordert weiterhin, dass die Datenbank jedes dieser untergeordneten Elemente berücksichtigt. Wenn Sie die letzten 10 von 100 Millionen Artikeln anfordern, bitten Sie die Datenbank, 999.999.990 Artikel zu betrachten, die Sie offensichtlich nicht interessieren.

Es ist unmöglich zu sagen, was das Maximum ohne eine konkretere Beschreibung ist Datengröße, Bestellkriterien usw. Aber um ehrlich zu sein, ist das Beste, was Sie wahrscheinlich bekommen, ein Wert mit einer großen Varianz, die sich im Laufe der Zeit wahrscheinlich ändern wird.

Der beste Ansatz in Firebase (und den meisten NoSQL-Lösungen) besteht darin, die Daten so zu modellieren, dass sie mit den Daten Ihrer App übereinstimmen. So zum Beispiel: Wenn Sie Ihren Benutzern die neuesten 10 Artikel anzeigen müssen, speichern Sie die (Schlüssel) der letzten 10 Artikel in einer separaten Liste.

items 
    -K........0 
     title: "Firebase Performance: How many children per node?" 
     body: "If a node has 100 million children, will there be a performance impact if I:..." 
    -K........1 
     title: "Firebase 3x method won't working in real device but worked in simulator swift 3.0" 
     body: "Hi we are working with google firebase 3x version and we faced..." 
    . 
    . 
    . 
    -K999999998 
    -K999999999 
recent 
    -K999999990: true 
    -K999999991: true 
    -K999999992: true 
    -K999999993: true 
    -K999999994: true 
    -K999999995: true 
    -K999999996: true 
    -K999999997: true 
    -K999999998: true 
    -K999999999: true 

Ich bin mir nicht sicher, ob ich die richtige Anzahl von Neunen da drin, aber ich hoffe, Sie bekommen die Idee.

+2

Und "nur eines der Kinder zu beobachten" ist so einfach wie 'ref.child (childId) .on ('value', ...)' – Kato

+0

Danke! Wenn Sie nach einem bestimmten indizierten Feld suchen, würde ich erwarten, O (log (N)) erreichen zu können. Ist das die Art von Leistung, die Sie bekommen? (Das würde ~ 26 Versuche mit einem Dataset von 100 mil benötigen) – CalM

+0

In dem obigen Beispiel ist die wachsende Liste von 'items' ein Problem, obwohl, wenn ich keinen direkten Lesezugriff auf den Items-Knoten hatte? Hätten Sie eine Art Archivierungsmechanismus implementiert? wie 'items/june2017',' items/aug2017', .... etc? oder vielleicht verschieben Sie die Elemente alle zusammen zu einem neuen Knoten, nachdem sie nicht aktiv verwendet wurden. – Atu

Verwandte Themen