2013-07-02 14 views
12

Diciamo che ho due tipi di oggetti utenti e account. Gli utenti possono avere molti account e condividerli con altri utenti. Quindi AccountA potrebbe essere disponibile per Utente1 e Utente2. Mentre AccountB è disponibile solo per Utente1. Quindi Utente1 ha due account e Utente2 ha un account.Molti-a-molti che utilizzano Firebase

Qual è il modo "firebase" per strutturare questo?

Inizialmente pensavo che gli utenti potessero memorizzare una serie di account a cui appartengono.

users: { 
    1: { 
    name: 'Ted', 
    accounts: [1, 2] 
    } 
    2: { 
    name: 'Frank', 
    accounts: [1] 
    } 
} 

accounts: { 
    1: { 
    name: "Checking" 
    }, 
    2: { 
    name: "Savings" 
    } 
} 

o l'account disporrà di una gamma di utenti.

users: { 
    1: { 
    name: 'Ted' 
    } 
    2: { 
    name: 'Frank' 
    } 
} 

accounts: { 
    1: { 
    name: "Checking", 
    users: [1, 2] 
    }, 
    2: { 
    name: "Savings" 
    users: [1] 
    } 
} 

Mi chiedo in che modo si presta per me di trovare facilmente gli account di un utente in modo che quando Ted accede posso elencare i conti che appartengono senza dover abbattere l'intero database. Per sicurezza, non voglio comunque tutti quei dati sulla sua macchina.

Domanda n. 1 Le norme di sicurezza si prenderanno cura di questo? Con ciò intendo che sto programmando di impostare la mia regola di sicurezza in modo che gli utenti possano solo gli account a cui appartengono. Spero che se chiedo "/ account" restituirò solo quegli account a cui l'utente può accedere ... no?

Domanda n. 2 Esiste un meccanismo per la richiesta di un elenco di elementi. Come "/ accounts/[1,2]" in modo che torni i conti "/ accounts/1" e "/ accounts/2"?

Grazie per qualsiasi informazione che è possibile condividere.

risposta

20

Prima di saltare nello specifico, ci sono alcune cose che si vorrà tenere a mente:

  1. Sarete in genere vuole strutturare i dati, sulla base di modelli di lettura. Quindi, se hai bisogno di cercare tutti gli account in cui è presente un utente, dovrai archiviare quell'elenco da qualche parte. E se vuoi cercare tutti gli utenti associati a un account, dovrai archiviare anche quell'elenco. Quindi, riguardo alla domanda n. 2, Firebase attualmente non ha alcuna capacità di interrogazione generica (come "/ accounts [1,2]"), anche se questo probabilmente arriverà in futuro.
  2. Non è possibile utilizzare le regole di sicurezza per eseguire query sui dati. Sei autorizzato a leggere tutti i dati in un luogo, o nessuno dei due. Quindi, per quanto riguarda la tua domanda n. 1, le regole di sicurezza non eseguiranno automaticamente query/account per te.
  3. Le regole di sicurezza non consentono di cercare il contenuto di un array per un elemento, ma possono verificare l'esistenza di una chiave in un oggetto. Pertanto se gli utenti 1 e 4 hanno accesso a qualcosa, probabilmente vorrai memorizzare {1: true, 4: true} piuttosto che [1, 4].

Con questo in mente, mi consiglia di memorizzare i dati come il vostro primo esempio, ma senza l'utilizzo di matrici:

users: { 
    1: { 
    name: 'Ted', 
    accounts: { 
     1: true, 
     2: true 
    } 
    } 
    2: { 
    name: 'Frank', 
    accounts: { 
     1: true 
    } 
    } 
} 

accounts: { 
    1: { 
    name: "Checking" 
    }, 
    2: { 
    name: "Savings" 
    } 
} 

Questo vi permetterà di ottenere facilmente tutti gli account per un particolare utente. Se è necessario anche essere in grado di andare nella direzione opposta (tutti gli utenti per un account), sarà necessario duplicare tali informazioni e memorizzarle negli account. Es .:

accounts: { 
    1: { 
    name: "Checking", 
    users: { 
     1: true, 
     2: true 
    } 
    }, 
    2: { 
    name: "Savings", 
    users: { 
     1: true 
    } 
    } 
} 

Spero che questo aiuti!

+3

Specificare come si effettua la richiesta. Se solo tu hai un riferimento Firebase a un utente specifico. Come riceveresti informazioni sul suo account – feresr

+2

@feresr avresti bisogno di più richieste: la prima per ottenere l'elenco di account (/ utenti/1/account), e poi uno per ogni account che ti interessa (a/account/n). Questo è il motivo per cui a volte vale la pena tenere alcune informazioni di riepilogo sotto/users/x/accounts/y, come ad esempio il nickname dell'account. –

+0

Ok. Ho senso ora. Grazie! – feresr