2015-04-25 19 views
5

Vorrei fare una chat usando Firebase. Devo visualizzare per ciascun utente l'elenco del gruppo a cui appartengono e anche per ogni gruppo tutti i membri.Come memorizzare utenti e gruppi per una chat usando Firebase

A causa di come è progettato Firebase e per avere prestazioni accettabili, penso di creare un elenco di tutti i gruppi contenenti l'elenco di membri e, per ciascun utente, una voce con tutto il gruppo a cui appartengono.

La mia prima domanda è: è l'approccio giusto?

In tal caso, la seconda domanda è: come aggiungere o rimuovere un utente in modo atomico, ovvero assicurarsi che l'utente sia aggiunto al gruppo e che il gruppo sia aggiunto all'utente o non aggiunto (ovvero non viene mai memorizzato solo in 1 posizione e rende il DB incoerente)?

+0

Potete per favore pubblicare il tuo modello di dati? Sembra che tu sia sulla strada giusta con l'approccio denormalizzato. Per la seconda parte, potrebbe essere necessario utilizzare un servizio (o una fabbrica) per assicurarsi che gli utenti e i dati dei gruppi vengano aggiornati in un'unica posizione. Che cosa hai fatto finora? –

+0

Quello che ho in mente è semplicemente avere/groups/{group_id}/members e/users/{user_id}/gruppi con membri un array di id utenti e raggruppa una matrice di id di gruppo. Utente e Gruppo verranno aggiornati nello stesso luogo ma voglio essere sicuro che il database sia sempre coerente, anche nel caso estremo in cui il server si blocca dopo aver aggiornato il gruppo ma prima di aggiornare l'utente. – maalls

+0

Ho cambiato la mia domanda per renderla più chiara. – maalls

risposta

2

Il modello di dati che hai proposto è coerente con le raccomandazioni per Firebase. Una spiegazione più dettagliata è delineata nel best way to structure data in firebase

users/userid/groups 
groups/groupid/users 

Firebase fornisce .transaction per operazioni atomiche. È possibile collegare più transazioni per garantire la coerenza dei dati. È inoltre possibile utilizzare la funzione di callback completo. Per una spiegazione dettagliata, fare riferimento a firebase transaction. Sto usando lo stesso approccio per mantenere aggiornati i messaggi multipli per un display del pannello di controllo.

Codice di esempio per transazione nidificata:

ref.child('users').child(userid).child(groupid).transaction(function (currentData) { 
    if (currentData === null) { 
    return groupid; 
    } else { 
    console.log('groupid already exists.'); 
    return; // Abort the transaction. 
    } 
    }, function (error, committed, snapshot) { 
    if (committed) { 
     console.log('start a new transaction'); 
     ref.child('groups').child(groupid).child(userid).tranaction(function (currentData) { 
     if (currentData === null) { 
      return userid; 
     } else { 
      console.log('Userid already exists.'); 
      //add code here to roll back the groupid added to users 
      return; // Abort the transaction. 
     } 
     }, function (error, committed, snapshot) { 
     if (error) { 
      //rollback the groupid that was added to users in previous transaction 
     } 
     }) 
    } 
}); 
+0

La transazione di Firebase è fondamentalmente utile per aggiornare un valore basato sul valore precedente. Ma non aiuta le operazioni atomiche in più posizioni. – maalls

+0

La funzione di aggiornamento è uno degli usi della transazione, è inoltre possibile utilizzare il callback onComplete per avviare una nuova transazione, creando transazioni nidificate. Ho aggiunto qualche codice di esempio. Sto già usando questo approccio e funziona per me. –

+0

grazie ma scusa, cosa sta facendo il codice o quando dovrei usarlo? È per aggiungere un nuovo utente a un gruppo? – maalls

Problemi correlati