Best Practices voor Firebase Realtime Database-ontwikkeling

Nieuws Rush gebruikt Firebase nu 4 maanden, en hoewel er dingen zijn die we graag verbeterd willen zien (kun je een "perfect product noemen"), is het een waardevolle toevoeging aan onze stapel voor onze mobiele gegevenssynchronisatie-eisen.

Onderweg hebben we enkele lessen geleerd over hoe we het platform het beste kunnen gebruiken om aan onze behoeften te voldoen. Firebase is een documentgeoriënteerde / NoSQL-database en deelt dus veel van de kenmerken van die platforms, maar heeft ook enkele unieke eigenschappen om te leren. Hier is een snelle hersenkraker van wat we onderweg hebben ontdekt.

RTFM!

SDK-documentatie is meestal verschrikkelijk, dus velen van ons hebben de neiging om naar de hoogtepunten te skippen en er later (of nooit) naar terug te keren.

Het tegenovergestelde is hier waar. De handleidingen en voorbeelden zijn eenvoudig te volgen en de referentiedocumenten zijn zowel grondig als bedrieglijk kort. Bijna elke keer dat ons team een ​​vraag of probleem had, vonden we de oplossing in iets dat we in de documenten misten. We gingen uiteindelijk zitten en lazen elk woord recht door en het was 3 uur goed besteed.

Er is ook een blog die een schat is voor het vinden van oplossingen voor echte problemen. Hier zijn een paar van de berichten die we het meest kritisch vonden in News Rush:

  • Groepsbeveiliging in de Firebase-database
  • Query's, deel 1: algemene SQL-query's geconverteerd voor Firebase
  • Best Practices: Arrays in Firebase

Corollary: "Schema-minder" betekent niet hersenloos!

Het is een veel voorkomende misvatting dat documentgeoriënteerde databases vooraf plannen maken over hoe gegevens minder gestructureerd zullen worden. Dit is een mythe. We hebben het tegenovergestelde gevonden: ze hebben meer nodig.

Het is niet ongebruikelijk om te zeggen dat goede planning kan helpen om de meeste prestaties uit een softwarecomponent te halen. Maar in SQL-databases is het meestal eenvoudig om planningsfouten te repareren door gewoon aan meer tabellen deel te nemen, subquery's te doen of bulkgegevensupdates te doen. Omdat Firebase deze concepten niet heeft, neemt u de tijd om te gaan zitten en uw gegevens en toegangspatronen vooraf te modelleren. Je zult blij zijn dat je het gedaan hebt.

En RTFM!

Ondersteuning is verwarrend

Er zijn een aantal ondersteuningsopties, maar proberen om de verkeerde in een bepaalde situatie te gebruiken, kan frustrerend zijn. Onze ervaringen zijn:

  • Slack: gemeenschapsgerichte zelfhulp en brainstorming niet geschikt voor andere locaties. Niet geschikt voor "er is iets mis."
  • Ondersteuningsformulier: de 'officiële' ondersteuningslocatie. Meld hier "er is iets mis". Functieverzoeken die waarschijnlijk een ingeblikte reactie opleveren "we zullen het overwegen, maar geen beloften".
  • Google Discussiegroepen: actieve betrokkenheid van het kernteam met de gebruikelijke kanttekeningen bij doorlooptijd in groepsgerichte e-mailsystemen. Beste plaats voor zeer technische discussies over app-internals en "rare" problemen.
  • StackOverflow: langzame / onvoorspelbare responstijden, maar de beste plaats voor back-upreferentiemateriaal. Als je een vraag en antwoord hebt gelezen over StackOverflow, weet je ook het soort vraag dat je daar het beste kunt posten.

Refs en eenvoudige opvragingen zijn "goedkoop"

In Firebase is een "ref" als een pointer naar gegevens. Het is instinctief om ze in de cache te willen opslaan of anderszins te beheren, maar in de huidige Firebase-clientbibliotheken moet je dit nooit doen. Ze zijn echt alleen maar rond de URL-verwijzingen naar gegevensobjecten en de terugbelafspraken voor gebeurtenissen waartoe ze toegang bieden, kunnen slechts één luisteraar tegelijk hebben. Als je naar een object moet verwijzen vanuit twee verschillende plaatsen, neem er dan twee refs naar. Het kost hier niets meer voor.

Een vergelijkbare regel is van toepassing op het ophalen van gegevens. Degenen die uit SQL-databases komen, zijn eraan gewend grotere objecten in zo weinig mogelijk query's op te halen om de round-trip tijd en query overhead te elimineren. Bij het afvlakken van gegevensstructuren is het verleidelijk om "samenvattende" gegevens naar meerdere locaties te kopiëren om met één ophaalactie alles te krijgen wat nodig is.

In Firebase is dit bijna volledig de verkeerde beslissing. Om te beginnen zijn simpele key / ref-gebaseerde retrievals sterk geoptimaliseerd en Firebase biedt enorme horizontale schaal voor hen. In onze prestatietests bij News Rush hebben we ook vastgesteld dat Firebase het veel beter doet met meer, kleinere objecten. Zelfs het verwijderen van een paar onnodige velden kan een meetbare prestatieverhoging opleveren.

Net als met de geoptimaliseerde patronen van Redis voor structuren zoals hashes en sets, is de enorme horizontale schaalbaarheid van Firebase een van de belangrijkste kenmerken. Het moet niet alleen een plezierige bezigheid zijn. Het moet zelf worden gebruikt als hulpmiddel in uw app-ontwerpen.

Vermijd arrays

De Firebase-documentatie behandelt dit onderwerp al. Het klopt allemaal. Vermijd ze.

Geen datums

Firebase heeft geen datumobjecttype en staat aflopende sorteringen niet toe. We hebben zojuist een helper "update" -functie geschreven die native objecten met datumvelden neemt en deze converteert naar milliseconden-sinds-tijdperk-waarden, en ook overeenkomstige negatieve getalsvarianten van die waarden toevoegt. Oplopend sorteren op een tijdswaarde met een negatief getal geeft de gewenste aflopende volgorde.

Eén maat past niet allemaal

Het leek destijds zo'n goed idee ...

Maak gebruik van de sterke punten van Firebase. Probeer het niet elke klus te laten doen die je hebt. Hier zijn enkele dingen die Firebase niet is:

  • Een zoekmachine. Het heeft een paar basisbewerkingen zoals prefix-matching, maar dat is het. Gebruik ELK, Algolia, enz. Als u volledig zoeken nodig heeft.
  • Een API-stapel. Cloud Functions voor Firebase ziet er veelbelovend uit, maar is nog steeds in Beta. Als uw app meer is dan een takenlijst, moet u plannen hoe u server-side / vertrouwde code uitvoert.
  • Een rapportagemotor. Misschien wilt u nog steeds gebruik maken van een relationele database wanneer u uw gegevens moet segmenteren / dobbelen / filteren / muteren / munge / etc.
  • Zelfgehost of volledig bruikbaar offline. Offline functionaliteit wordt geleverd via synchronisatie / persistentie, maar de Firebase-cloud moet er eerst bij worden betrokken.

Instellen versus bijwerken

Er is een groot verschil tussen SET- en UPDATE-bewerkingen. Het beïnvloedt wat er gebeurt als een sleutel nog niet bestaat, met name sleutels in complexe objecten. Besteed er aandacht aan!

FirebaseUI is geweldig!

Oh, ik moet vermelden, er zijn FirebaseUI-bijbehorende projecten voor veel platforms. Gebruik ze. Ze zijn ongelooflijk nuttig voor dingen als het instellen van een tabelweergave om een ​​lijst met objecten in een Firebase-verzameling weer te geven.

Deze bibliotheek biedt FUICollectionViewDataSource- en FUITableViewDataSource-klassen (en hun equivalenten op Android) die het starten op een mobiel platform slechts een paar regels code maken. Die lopende start was erg leuk toen we Firebase aanvankelijk evalueerden. We waren in staat om een ​​proof of concept in een paar uur samen te stellen met heel weinig leren in vergelijking met andere opties op de tafel.

Wanneer je klaar bent voor meer verfijning en controle, is FirebaseUI nog steeds nuttig omdat het ook de gegevensverzamelklassen FUIArray en FUIIndexArray op een lager niveau biedt waarmee je dingen als tab headers en andere vreemde baldisplays kunt besturen.

Heb ik iets gemist? Deel het zelf!