2016-03-19 2 views
0

Je suis en train d'apprendre Firebase et j'ai remarqué que toute opération remplace simplement les données, ce qui est un peu différent de ce que j'ai vu sur couchDB. Dans ma compréhension de leur documentation, dans le but de faire une annulation/annulation d'une opération .update() possible, j'utiliserais la méthode .push(). L'idée serait de conserver 2 versions des données, de sorte que je puisse interroger l'objet précédent. POUR COMMENCER, il devrait y avoir une approche de type FILO donc je ne stocke pas plus de 2 éléments.Firebase - façon correcte d'implémenter un .update() non annulable?

BASE DE DONNÉES AVANT PREMIERE ECRITURE:

myData 
+ someObject 
    - keyOne : valueOne 
    - keyTwo : valueTwo 

BASE DE DONNÉES APRÈS LA PREMIÈRE ECRITURE ref.child(someObject).update({keyOne:valueOneUpdated}):

myData 
+ someObject 
    - keyOne : valueOneUpdated 
    - keyTwo : valueTwo 

Ce qui précède n'est pas le résultat souhaité, car j'ai perdu la version précédente de l'élément.

BASE DE DONNÉES APRÈS LA PREMIÈRE ECRITURE ref.child(keyOne).push({keyOne:valueOneUpdated}):

myData 
+ someObject 
    + keyOne 
    + 1k34jh23kj4h : valueOneUpdated 
    + 237we8sjkdf8 : valueOne 
    - keyTwo : valueTwo 

Beurk! Comme il n'y a pas de méthode pop() pour supprimer le dernier élément d'une telle opération, je suis maintenant confronté à devoir trouver en quelque sorte quel est le premier et quel est le dernier élément.

Certes, il doit y avoir une façon élégante et directe de rendre possible le retour en arrière, non? Qu'est-ce que je rate?

Merci.

+0

Il existe plusieurs façons de créer un système de gestion des versions sur une base de données. Lequel est le mieux pour vous, dépend largement des besoins de votre application. –

Répondre

2

Si le but est d'avoir un seul niveau d'annulation, c'est assez simple.

myData 
    someObject 
    keyOne 
     currentValue: valueOneUpdated 
     priorValue: valueOne 
    keyTwo 
     currentValue: valueTwo 

Si le nœud PRIORVALUE existe alors permettre l'annulation, et déplacez sa valeur à la currentValue puis retirez la valeur avant.

Vous pouvez étendre à ce sujet avec l'ajout de plusieurs undos en tirant parti d'un tableau dans Firebase

myData 
    someObject 
    keyOne 
     currentValue: valueOneUpdated 
     priorValues: 
      0: prior_value_3 //the value just prior to valueOneUpdated 
      1: prior_value_2 
      2: prior_value_1   

(conceptuellement) Le plus récent PRIORVALUE est à l'index 0 pour le lire, « pop », il la pile et écrire cette valeur à currentValue et «déplacer» l'autre valeur est en hausse.

Il n'y a pas réellement de fonction pour 'déplacer' les valeurs dans un tableau dans Firebase, il suffit donc de lire le tableau via le code, de supprimer le 0ème élément et de réécrire le tableau. Je ne suis pas un grand fan de Array dans Firebase en général, donc il y a d'autres options, plus extensibles, mais un tableau peut correspondre à ce cas d'utilisation spécifique. Firebase ne fournit pas de mécanisme de version intégré sur les données.

+0

Merci pour votre réponse. Voulez-vous élaborer sur les «autres approches» mentionnées? J'ai aussi l'impression que Firebase ne veut pas vraiment que vous stockiez des tableaux. – tim

+1

@tim Les tableaux sont bien, mais leur utilisation est situationnelle car il y a souvent de meilleures options. Dans ce cas, un tableau peut répondre au besoin car il fournit un ensemble auto-indexé de paires clé: valeur.Une autre option consiste à utiliser la même structure que celle mentionnée dans ma réponse, et dans le nœud priorValues, au lieu d'un tableau, générer des nœuds avec autoId comme clé et la valeur d'annulation comme valeur. Vous pouvez interroger par clé pour le plus récent et le supprimer comme il est utilisé. Vous souhaiterez peut-être également avoir une option Rétablir, donc stocker les étapes Annuler/Rétablir comme valeurs enfants de ce nœud fonctionnera également. – Jay

+0

Oui, l'annulation/refaire, je ne fais que changer l'index si vous faites un re-faire. Donc j'utiliserais juste 'keyOne: {0: valueOne, 1: valueOneUpdated}' – tim