Tips Meningkatkan Performa Firebase Database

Firebase menjadi idola banyak developer karena memungkinkan mereka untuk membuat aplikasi tanpa perlu bersusah payah membuat sendiri backend untuk aplikasinya. Berikut ini tips meningkatkan performa Firebase Database untuk membuat aplikasi pembaca memiliki performa yang lebih baik.

Hindari Data Bersarang (Nested Data)

Tidak seperti database SQL (seperti MySQL atau PostgreSQL), Firebase menggunakan pendekatan NoSQL - menyimpan data sebagai objek JSON. Sebagai hasilnya, kita mendapat data yang disimpan tanpa menggunakan tabel seperti yang bisa kita temukan di sistem database tradision, hanya sebuah file JSON yang terdiri dari node-node individual.

Misalnya, kita bisa menyimpan data tentang musik sebagai berikut:

{
   "songs" : {
      {
         "id"     : 1,
         "artist" : "Depeche Mode",
         "track"  : "Precious",
         "album"  : "Playing the Angel",
         "genre"  : "Electronic",
         "year"   : 2005,
         "rating" : 5
      },
      {
         "id"     : 2,
         "artist" : "Depeche Mode",
         "track"  : "Precious",
         "album"  : "Suffer Well",
         "genre"  : "Electronic",
         "year"   : 2005,
         "rating" : 5
      }
   }
}

Data yang tersimpan di atas sudah mencukupi. Namun, Firebase memungkinkan kita menambah data hingga 32 level dalamnya, sehingga terkadang developer tanda sadar menambahkan banyak data di dalam satu dan yang lainnya.

Misalnya, aplikasi musik kita memperbolehkan user mengomentari setiap lagu sehingga struktur data kita menjadi:

{
   "songs" : {
      {
         "id"     : 1,
         "artist" : "Depeche Mode",
         "track"  : "Precious",
         "album"  : "Playing the Angel",
         "genre"  : "Electronic",
         "year"   : 2005,
         "rating" : 5,
         "comments": {
           "comment1": {
             "sender": "dgahan",
             "title": "Love this song",
             "message": "Could this band do any wrong?"
           },
           "comment2": {
             "sender": "mgore",
             "title": "Plenty more where that came from",
             "message": "One of my faves for sure!"
           },
            "comment3": {
             ...
           }
           // MANY more comments to follow...
         }
      },
      {
         ...
      }
   }
}

Contoh di atas tidak baik. Kenapa? karena setiap membaca satu data lagu, kita bisa jadi akan mengunduh banyak data komentar dan Firebase telah memperingatkannya di dokumentasi.

Cara yang lebih baik ialah dengan meratakan struktur datanya (atau dikenal juga dengan istilah normalisasi) sebagai berikut:

{
   "songs" : {
      {
         "id"     : 1,
         "artist" : "Depeche Mode",
         "track"  : "Precious",
         "album"  : "Playing the Angel",
         "genre"  : "Electronic",
         "year"   : 2005,
         "rating" : 5
      }
   }


   // Move the comments into their own node
   // Reference the track for each comment by its ID
   "comments": {
      "comment1": {
         "track" : 1,
         "sender": "dgahan",
         "title": "Love this song",
         "message": "Could this band do any wrong?"
      },
      "comment2": {
         "track" : 1,
         "sender": "mgore",
         "title": "Plenty more where that came from",
         "message": "One of my faves for sure!"
      },
      "comment3": {
         ...
      }
   }
}

Pembagian nodes memungkinkan komentar untuk diunduh hanya jika diminta berdasarkan ID lagu yang mereka punya (track). berbeda dengan impelemntasi sebelumnya dimana saat kita mengambil satu lagu, maka kita juga akan mengambil semua komentar di dalamnya meskipun tidak berniat untuk menampilkan komentar tersebut.

Indeks Database

Firebase menggunakan sebuah child key untuk melakukan query di collection. Cara ini cukup baik untuk data yang kecil tapi untuk aplikasi yang sudah berkembang, performa query-nya mungkin akan semakin menurun sehingga waktu tunggunya menjadi lebih lama.

Tidak ideal jika aplikasi kita melakukan query ke banyak data sambil diakses oleh banyak user diwaktu yang sama.

Rule .indexOn memungkinkan developer menentukan data apa yang akan diatur sebagai index di dalam Firebase Realtime Database Rules-nya. Dengan menggunakan index tersebut, Firebase bisa meningkatkan performa pencarian data dengan mengurangi waktu pengambilan data tersebut.

Berikut ini contoh untuk mengatur agar data artist, genre, dan year dimasukkan ke dalam .indexOn:

{
  "rules": {
    ".read": true,
    ".write": "auth != null",
    "songs": {
      ".indexOn": ["artist", "genre", "year"]
    }
  }
}

Menggunakan Transactions

Menghindari penumpukan data/data rusak saat beberapa user mengupdate data yang sama sangat penting untuk dilakukan. Apalagi, jika kita ingin agar data tersebut lebih akurat.

Firebase transactions membantu menjaga integritas data dengan menghindari penumpukan data saat dua atau lebih user secara bersamaan mencoba mengubah data yang sama.

Misalnya, jika kita ingin sebuah aplikasi memperbolehkan user untuk mengumpulkan jumlah poin yang mereka miliki kita bisa membuat transactions sebagai berikut:

determinePoints(userName : string): Promise
{
   return new Promise((resolve) =>
   {
      var userRef    = firebase.database().ref('users/' + userName + '/points');
      userRef.transaction((currentPoints) =>
      {
         resolve(currentPoints + 1);
      });
   });
}

Menggunakan Cloud Functions

Cloud functions memungkinkan developer untuk menjalankan kode backend secara otomatis saat sebuah event dipanggil oleh Firebase dan request HTTP. Kode backend ini disimpan dan diatur di Google Cloud.

Cloud function bisa berisi misalnya, pendaftaran user baru, mengirim email selamat datang saat user mendaftar, dsb.

Function ini bisa dibuat oleh developer melalui Firebase CLI dan bisa mengurangi logic di aplikasi klien sehingga proses tersebut bsa dipindah ke server. Teknik ini bisa mengurangi kerja CPU, penggunaan memory dan meningkatkan performa aplikasi.

Sumber: masteringionic.com

Dilihat kali

Is this helpful?

Share This Post