stavo indagando Database Firebase sample per Android e capito che memorizza i propri dati nel seguente modo:Firebase Database - la tecnica "a ventaglio"
io non sono abbastanza familiarità con NoSQL tecniche e cercando di capire perché dobbiamo perseguire ciascuna entità post
due volte - a posts
e user_posts
corrispondentemente. La documentazione dice che questo approccio è chiamato "Fan Out" e sono pienamente d'accordo che potrebbe essere utile accedere ai post degli utenti tramite una semplice costruzione come databaseReference.child("user-posts").child("<user_uid>")
. Ma perché abbiamo bisogno del nodo posts
? E se avessimo bisogno di aggiornare qualche post? Dobbiamo farlo due volte?
// [START write_fan_out]
private void writeNewPost(String userId, String username, String title, String body) {
// Create new post at /user-posts/$userid/$postid and at
// /posts/$postid simultaneously
String key = mDatabase.child("posts").push().getKey();
Post post = new Post(userId, username, title, body);
Map<String, Object> postValues = post.toMap();
Map<String, Object> childUpdates = new HashMap<>();
childUpdates.put("/posts/" + key, postValues);
childUpdates.put("/user-posts/" + userId + "/" + key, postValues);
mDatabase.updateChildren(childUpdates);
}
// [END write_fan_out]
Quindi mi chiedo ... quando questo approccio potrebbe essere utile e quando no? Firebase SDK fornisce strumenti per mantenere sincronizzati tutti i duplicati durante l'aggiornamento o la rimozione dei dati?
UPDATE: Ecco la spiegazione received dalla squadra Firebase:
la ragione per i messaggi sono duplicati è perché vogliamo essere in grado di ottenere rapidamente tutti i messaggi appartenenti a un utente (come hai suggerito) e il filtro dall'elenco di tutti i post di sempre per ottenere i post da un utente può diventare piuttosto costoso con l'espansione del numero di post.
Ciò significa che dobbiamo aggiornare il post in due posizioni ogni volta che lo aggiorniamo. Rende il codice un po 'più brutto, ma poiché le query sono più comuni delle scritture, è meglio ottimizzare per leggendo i dati.
ho il sospetto che questo approccio potrebbe apparire non proprio elegante, ma è probabilmente l'opzione più veloce per grandi insiemi di dati fino a quando si esegue selezionare più spesso di quanto UPDATE. Tuttavia, in alcuni casi preferisco attenermi ad altre soluzioni consigliate qui.
Per una buona introduzione, vedere [Modellazione dati NoSQL] (https://highlyscalable.wordpress.com/2012/03/01/nosql-data-modeling-techniques/) –
Nella pagina "Struttura del database" da i documenti, l'orientamento è usare le bandiere per indicare la relazione a due vie (come affermato in altri commenti), mentre ciò che stanno facendo in questo codice contraddice questo. Penso che dovrebbero aggiungere alcuni chiarimenti in merito nella documentazione, ho appena inviato un feedback su di esso nella pagina dei documenti di Firebase. –