2015-04-29 14 views
5

Nach the firebase docs Daten abgeflacht und Indizes verwendet werden verschiedene Knoten im Baum zu verknüpfen:Firebase Datenkonsistenz über mehrere Knoten

users 
    $userId 
    widgets 
     $widgetId 
widgets 
    $widgetId 

In dem obigen Beispiel, wenn ein Benutzer ein Widget erstellt, dass widgetid auch ist unter dem Benutzerknoten gespeichert.

Meine Frage ist, ob es eine Möglichkeit gibt, die Konsistenz der Operation zu gewährleisten, wenn man bedenkt, dass jetzt mehr als ein Schreibvorgang erforderlich ist.

Unter der Annahme, die erste Operation ist:

var newKey = fb.child('widgets').push({ name: 'widge' }).key();

Ich kann es dann schreiben Sie an:

fb.child('users').child(auth.id).child('widgets').child(newKey).set(true);

Aber was, wenn es einen Fehler oder ein anderes Problem zwischen den beiden Schreiben war? Oder wenn ich mehrere Orte habe, muss ich diesen Schlüssel speichern und ein Fehler zwischen diesen Schreibvorgängen auftritt?

Gibt es derzeit eine Möglichkeit, dies in Firebase zu behandeln?

Wenn nicht, gibt es Pläne, dies in Zukunft zu unterstützen?

Und wenn ja, kann jemand ein konkretes Beispiel dafür geben, wie das geschehen würde?

+0

See [Feuerbasis-Multi-write] (https://github.com/katowulf/firebase-multi-write) und ** sicher sein, lesen "Do You Need Diese" **. Tipp: Wahrscheinlich nicht. – Kato

+0

@ Kato thx! Das sieht genau richtig aus - ich werde es mir ansehen. In Bezug auf "Do You Need This" geht es nicht immer darum, es zu brauchen, auch Fragen zu erklären und zu beantworten. – martypdx

+0

Und große Fragen sind sie. Um dagegen zu sein, werden viele andere dies lesen und es ist am besten, das auf den Tisch zu legen. – Kato

Antwort

2

Beachten Sie, dass dies jetzt Teil der Kern Firebase API ist. Details finden Sie unter this blog post.

var mergedUpdate = {}; 
mergedUpdate[ 'users/' + userId + '/widgets/' + widgetId ] = true; 
mergedUpdate[ 'widgets/' + widgetId ] = widgetData; 

var ref = new Firebase("https://<YOUR-FIREBASE-APP>.firebaseio.com/"); 
ref.update(mergedUpdate); 
+0

könnten Sie einen Einblick in eine Validierungsregel geben, die die WidgetId in den Benutzern/Knoten nur dann aktualisiert, wenn die neuen Daten beide Pfade enthalten? – Felipe

+0

Ich würde gerne helfen. Das klingt nach einer separaten Frage und würde spezifische Details benötigen, um irgendwie helfen zu können. Siehe [how to ask] (http://stackoverflow.com/help/how-to-ask) und [creating a mcve] (http://stackoverflow.com/help/mcve). – Kato

+0

@Kato Ist es derzeit möglich, auf zwei separate Knoten in einer Firebase-Transaktion zu schreiben?Ich nehme an, Ihre Antwort würde nicht gelten, wenn mehrere Benutzer versuchen würden, auf dieselbe Ressource zu schreiben, und nur ein Benutzer sollte dies tun dürfen. Bitte beraten. Meine Frage ist https://stackoverflow.com/questions/45508007 – bibscy

0

Werfen Sie einen Blick auf transaction operation und verwenden Sie onComplete Rückruf, um Ihre zweite schreiben. Sie können die Transaktionen verketten.
Die auf der Firebase-Site bereitgestellten Beispiele dienen zum sicheren Erhöhen von Zählern.

Ich habe einen Beispielcode für eine andere Frage zur Verfügung gestellt, die Ihnen helfen kann. How to store users and groups for a chat using Firebase

+0

Danke für die Links, aber IMO, das ist ein Hack, wenn der Client die Daten manuell zurücksetzt. Es mag der beste Hack sein, aber ich würde gerne hören, dass Firebase dies (noch) unterstützt. – martypdx

+0

Soweit ich weiß, wird die traditionelle Datenbanktransaktion (mehrere gruppierte Updates), die Ihre Änderungen automatisch rückgängig machen würde, nicht unterstützt. Die aktuelle .transaction schützt nur die gleichzeitige Aktualisierung (mehr wie die Sperrfunktion von dbms). –

Verwandte Themen