Vraag Firebase Database - de "Fan Out" -techniek


Ik was bezig met het onderzoeken van de Firebase-database monster voor Android en besefte dat het zijn gegevens op de volgende manier opslaat:

enter image description here

Ik ben niet helemaal bekend met NoSQL-technieken en probeer te begrijpen waarom we elk moeten volhouden post entiteit tweemaal - op posts en user_posts dienovereenkomstig. De documentatie zegt dat deze benadering 'Fan Out' wordt genoemd en ben het er volledig mee eens dat het nuttig kan zijn om berichten van gebruikers te bekijken via eenvoudige constructie zoals databaseReference.child("user-posts").child("<user_uid>"). Maar waarom hebben we de posts knoop dan? Wat als we een aantal berichten moeten bijwerken - moeten we dit twee keer doen?

// [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]

Dus ik vraag me af ... wanneer deze benadering nuttig zou kunnen zijn en wanneer niet? Biedt Firebase SDK hulpprogramma's om alle duplicaten gesynchroniseerd te houden tijdens het bijwerken of verwijderen van gegevens?


BIJWERKEN: Dit is de uitleg ontvangen van Firebase-team:

de reden dat de berichten worden gedupliceerd, is omdat we dat willen   Krijg snel alle berichten van een gebruiker (zoals je hebt voorgesteld) en   filteren in de lijst met alle berichten ooit om de berichten van één gebruiker te krijgen   kan vrij duur worden naarmate het aantal berichten groeit.

Dit betekent wel dat we de post op twee locaties moeten bijwerken   wanneer we het updaten. Het maakt de code een beetje lelijker maar sindsdien   vragen komen vaker voor dan schrijft het is beter om te optimaliseren voor   de gegevens lezen.

Ik vermoed dat deze benadering er niet helemaal elegant uitziet, maar het is waarschijnlijk de snelste optie voor grote gegevenssets, zolang je SELECT vaker uitvoert dan UPDATE. In sommige gevallen houd ik me echter liever aan de andere oplossingen die hier worden aanbevolen.


10
2017-07-04 10:05


oorsprong


antwoorden:


Data Fan Out is een geweldige techniek om te beheren enorme hoeveelheden gegevens. Als u dit patroon niet gebruikt, kunt u in de toekomst ernstige schaalproblemen krijgen.

Wat ik zie aan de structuur van uw database, is dat u de volledige berichtinformatie twee keer, en dat is geen goede gewoonte. U wilt opslaan alleen een verwijzing naar de post onder een ander knooppunt. U krijgt dus een knooppunt met de naam users-postsdie zal bestaan ​​uit gebruikerstoetsen, en elk van die sleutels zal een stel postsleutels hebben met waarde van true. Om het duidelijker te maken:

enter image description here

Op deze manier houdt u bij welke berichten de gebruiker heeft geschreven onder de users-posts knooppunt; en ook de gebruiker die elke post heeft geschreven onder de posts knooppunt. Het is nu mogelijk dat u een lijst met alle berichten van gebruikers moet krijgen. Wat u zou moeten doen is synchroniseren op de users-posts/USER_KEY/ knooppunt naar pak de sleutels voor alle berichten die de gebruiker heeft geschreven en krijg dan meer informatie over de post met de postsleutel die je net hebt gekregen.

Waarom wordt dit databaseontwerp aanbevolen? Omdat jij bent veel minder informatie krijgen voor elke synchronisatie (met Firebase geven we niet per se verzoeken uit, dus ik noem het lezen een synchronisatie). In uw voorbeeld, als u een luisteraar aansluit op de user-posts/USER_KEY/om een ​​lijst met alle berichten te krijgen, zul je ook vragen ALLE de informatie van ELKE post die ze hebben geschreven. Met de data fan out benadering kun je gewoon om de post informatie die u nodig hebt omdat je de sleutel van de berichten al hebt.


6
2017-07-06 02:05



Naar mijn mening is dit geen goede benadering, omdat je die gegevens moet synchroniseren en Firebase geen tool biedt om duplicaten gesynchroniseerd te houden. Een goede benadering zou zijn om alleen de sleutel op te slaan user-posts.

Ik stel voor dit te lezen, het is heel interessant om te begrijpen hoe je gegevens structureert: https://www.firebase.com/docs/web/guide/structuring-data.html


2
2017-07-04 10:25