2016-07-25 4 views
0

Ich versuche zu entscheiden, wie Sie die Daten für das folgende Szenario am besten strukturieren können. Ich habe 10000 Schafe auf einem Bauernhof mit 50 miteinander verbundenen Feldern. Ich verfolge jedes Schaf, wenn sie ein Feld betreten und verlassen. Ich möchte in die Lage:Firebase-Datenstruktur für Echtzeit-Snapshot und retrospektive Analyse

  • retrospektiv jedes Schafs Bewegung über einen Zeitraum gegebenen Zeit analysieren
  • Ich mag auch jedes Feld der Nutzung im Laufe der Zeit kenne
  • sofort analysieren, welches Feld jedes gegebenes Schaf ist zur Zeit in
  • sofort wissen, welche Schafe sind in einem bestimmten Bereich

ich die documentation über gelesen habe de-Normalisierung der Daten, und ich schätze, dass ich alles Abfragen mit tun können, usw.

Meine Frage ist: Soll ich die Eingangs-/Ausgangsdaten Schafe & Feldknoten duplizieren wie dies ?:

{ 
    sightings: { 
     uniqueSheepId: { 
      FirebaseAutoId: { 
       type: enter 
       fieldId: uniqueFieldId 
       timestamp: xxxxxxxx.xxxxx 
      } 
     } 
    } 
} 

UND

{ 
    sightings: { 
     uniqueFieldId: { 
      FirebaseAutoId: { 
       type: enter 
       sheepId: uniqueSheepId 
       timestamp: xxxxxxxx.xxxxx 
      } 
     } 
    } 
} 

Dieses wie ein guter Weg scheint für eine Echtzeit bekommen Momentaufnahme, wie viele Schafe in einem bestimmten Feld sind. Es erlaubt uns auch leicht zu sehen, wo ein Schaf gerade ist und wo es gewesen ist, ohne irgendwelche Fragen zu stellen. Offensichtlich wird die Größe des Datasets doppelt so groß wie bei Abfragen, aber überwiegt die Einfachheit der Datengewinnung die Kosten für die Speicherung der Daten?

Ich habe die Chatroom/Mitglieder-Beispiele auf SO gesehen (und verstanden), aber ich glaube, dass mein Wunsch, die Mitgliedschaft/Nutzung von den Schaf- und Feldperspektiven rückblickend zu analysieren, meine Frage leicht von diesen Antworten unterscheidet. Jeder Rat wäre großartig.

Antwort

1

Ihre aktuelle Datenstruktur würde dies genügen:

sightings: { 
    uniqueSheepId: { 
     FirebaseAutoId: { 
      type: enter 
      fieldId: uniqueFieldId 
      timestamp: xxxxxxxx.xxxxx 
     } 
    } 
} 

und Sie würden nicht duplizieren müssen. Sie können eine Abfrage für jede Anforderung erstellen, die Sie haben.

Ich habe jedoch viele Male bereit, dass es besser ist, in Firebase flachere Bäume zu erstellen als weniger tiefe Bäume zu erstellen. Die folgende empfohlene Struktur wäre besser, einige Abfragen und nicht so gut für andere, aber ich glaube insgesamt wäre es besser und ermöglichen für andere Eigenschaften von fields und sheep in der Zukunft hinzugefügt werden.


So redundante Daten zu begrenzen ich drei verschiedene Bäume gesetzt würde, sheep, fields und sightings.

sheep: { 
    uniqueSheepId: { 
     currentField: uniqueFieldId, 
     sightings: { 
      FirebaseAutoId: uniqueSightingsId, 
      ... 
     } 
    } 
} 

fields: { 
    uniqueFieldId: { 
     numberOfSheep: number, 
     sightings: { 
      FirebaseAutoId: uniqueSightingsId, 
      ... 
     } 
    } 
} 

sightings: { 
    FirebaseAutoId: { 
     type: enter, 
     sheepId: uniqueSheepId, 
     fieldId: uniqueFieldId, 
     timestamp: xxxxxxxx.xxxxx 
    } 
} 

retrospektiv jeder Bewegung Schaf analysieren über einen bestimmten Zeitraum

Sie die Bewegung der Schafe abfragen können: sheep/uniqueSheepId/sightings

Ich möchte auch jedes Mal

Sie verwenden den Bereich der Nutzung über das Feld analysieren abfragen: fields/uniqueFieldId/sightings

sofort wissen, welches Feld jedes gegebene Schafe ist zur Zeit in

Sie können das Feld für ein beliebiges Schaf abfragen: sheep/uniqueSheepId/currentField

wissen sofort, welche Schafe in einem bestimmten Bereich sind

In JavaScript Sie so nicht abfragen:

var ref = firebase.database().ref("sheep").orderByChild("currentField").equalTo(uniqueFieldId); 

Ein Äquivalent kann getan werden, in jeder Sprache Firebase unterstützt.

All dies geht davon aus, dass Sie aktualisieren und in Echtzeit auf die Datenbank drücken.

+0

Danke dafür. Ich verstehe, was Sie vorschlagen und kann sehen, wie es die Anforderungen stellt, die ich eingestellt habe. Es scheint jedoch "relational" in dem Sinne zu sein, dass ich "Sichtungen" filtern muss, um Details der Sichtungen eines bestimmten Schafs (oder Feldes) basierend auf den Kindern in "Schafen/uniqueSheepId/Sichtungen" zu erhalten. Da ich dies nachschlagen muss, fühlt es sich so an, als wäre es nicht viel schlimmer, einfach nach '/ Sichtungen' für Kinder zu suchen, die' sheepId == uniqueSheepId' haben und die Referenzen in '/ sheep/uniqueSheepId/Sichtungsknoten. Speichern Sie eine Liste von Referenzen viel effizienter? – James

+0

Es ist alles abhängig. Einige meiner empfohlenen Abfragen erfordern Daten aus einer vorherigen Abfrage. Aber Ihre Abfragen würden einen viel größeren Baum durchforsten und das könnte genauso viel Zeit wie 2 kleinere Abfragen dauern. Ich habe meine Frage bearbeitet, den Anfang gelesen. – theblindprophet

+0

Danke für diese Klarstellung. Ich denke, dies ist ein "$$$ Kosten für das Speichern von normalisierten Daten vs Zeit Kosten einer Abfrage" Problem. Da die Sichtungsdaten nur einmal geschrieben werden (d. H. Sie werden nie aktualisiert), erscheint es nicht allzu problematisch, sie gleichzeitig an zwei Orten (Schaf und Feld) zu schreiben. Die Kosten für Firebase scheinen für diesen Anwendungsfall ziemlich angemessen zu sein. BTW Ich werde definitiv Ihre currentField & numberOfSheep "counter" -Eigenschaften zu meiner Datenstruktur hinzufügen - danke auch dafür. – James