Membuat Struktur Database Anda

Sebelum memulai

Sebelum dapat menggunakan Firebase Realtime Database, Anda harus membuat project Firebase dan menambahkan paket Firebase Unity SDK ke project Unity Anda.

Penyiapan:

Prasyarat

Android

  • Unity 5.0 atau yang lebih baru
  • Android NDK versi 10d atau yang lebih baru

iOS

  • Unity 5.0 atau yang lebih baru
  • Xcode 8.0 atau yang lebih baru

Jika Anda belum memiliki project Unity, download salah satu sampel quickstart kami dan cobalah dengan fitur Firebase tertentu. Jika Anda menggunakan quickstart, ingatlah untuk mendapatkan ID paket dari setelan project karena akan diperlukan untuk langkah selanjutnya.

Menyiapkan aplikasi Anda di Firebase console

Untuk menambahkan Firebase ke aplikasi Anda, Anda memerlukan project Firebase dan file konfigurasi Firebase untuk aplikasi Anda.

Untuk membuat project Firebase:

  1. Buka Firebase console.

  2. Klik Tambahkan project, lalu pilih atau masukkan Nama project .

    • Jika Anda memiliki project Google yang terkait dengan aplikasi Anda, pilih project tersebut dari menu dropdown Nama project .
    • Jika Anda belum memiliki project Google, masukkan Nama project yang baru.
  3. (Opsional) Edit Project ID.

    Firebase menetapkan ID unik ke project Firebase Anda secara otomatis. ID ini ditampilkan di layanan Firebase yang tersedia untuk publik, misalnya:

    • URL database default — your-project-id.firebaseio.com
    • Subdomain hosting default — your-project-id.firebaseapp.com
  4. Ikuti langkah-langkah penyiapan yang tersisa, lalu klik Buat project (atau Tambahkan Firebase jika Anda menggunakan project Google yang sudah ada).

Firebase menyediakan resource untuk project Firebase Anda secara otomatis. Proses ini biasanya perlu waktu beberapa menit. Setelah selesai, Anda akan dibawa ke halaman ringkasan untuk project Firebase Anda di Firebase console.

Android

  1. Klik Tambahkan Firebase ke aplikasi Android Anda dan ikuti langkah-langkah penyiapannya. Jika Anda mengimpor project Google yang sudah ada, prosesnya dapat terjadi secara otomatis dan Anda dapat langsung mendownload file konfigurasi.
  2. Saat diminta, masukkan nama paket aplikasi Anda. Anda harus memasukkan nama paket yang digunakan oleh aplikasi Anda, yang hanya dapat dilakukan jika aplikasi tersebut ditambahkan ke project Firebase Anda.
  3. Selama proses ini, Anda akan mendownload file google-services.json. Anda dapat mendownload file ini lagi kapan saja.
  4. Setelah Anda menambahkan kode inisialisasi, jalankan aplikasi Anda untuk mengirimkan verifikasi ke Firebase console bahwa Anda telah berhasil menginstal Firebase.

iOS

  1. Klik Tambahkan Firebase ke aplikasi iOS Anda dan ikuti langkah penyiapannya. Jika Anda mengimpor project Google yang sudah ada, prosesnya dapat terjadi secara otomatis dan Anda dapat langsung mendownload file konfigurasi.
  2. Saat diminta, masukkan ID paket aplikasi Anda. Anda harus memasukkan ID paket yang digunakan aplikasi. Hal ini hanya dapat dilakukan saat Anda menambahkan aplikasi tersebut ke project Firebase Anda.
  3. Selama proses ini, Anda akan mendownload file GoogleService-Info.plist. Anda dapat mendownload file ini lagi kapan saja.
  4. Setelah Anda menambahkan kode inisialisasi, jalankan aplikasi Anda untuk mengirimkan verifikasi ke Firebase console bahwa Anda telah berhasil menginstal Firebase.
  5. Pindahkan GoogleService-Info.plist yang didownload dari Firebase console ke folder mana pun di project Unity.

Menambahkan Firebase Unity SDK ke aplikasi Anda

  1. Download Firebase Unity SDK.
  2. Pilih item menu Assets > Import Package > Custom Package.
  3. Impor FirebaseDatabase.unitypackage dari direktori yang sesuai dengan versi Unity yang Anda gunakan:
    • Unity 5.x dan versi yang lebih lama menggunakan framework .NET 3.x, jadi Anda perlu mengimpor paket dotnet3/FirebaseDatabase.unitypackage .
    • Unity 2017.x dan versi yang lebih baru mendukung penggunaan framework .NET 4.x. Jika project Anda dikonfigurasi agar dapat menggunakan .NET 4.x, impor paket dotnet4/FirebaseDatabase.unitypackage .
  4. Saat jendela Import Unity Package muncul, klik tombol Import.

Menginisialisasi SDK

Firebase Unity SDK di Android memerlukan layanan Google Play versi terbaru sebelum SDK dapat digunakan. Kode berikut harus ditambahkan di awal aplikasi Anda untuk memeriksa dan mengupdate layanan Google Play secara opsional ke versi yang diperlukan oleh Firebase Unity SDK sebelum memanggil metode lain di SDK.

Firebase.FirebaseApp.CheckAndFixDependenciesAsync().ContinueWith(task => {
  var dependencyStatus = task.Result;
  if (dependencyStatus == Firebase.DependencyStatus.Available) {
    // Create and hold a reference to your FirebaseApp, i.e.
    //   app = Firebase.FirebaseApp.DefaultInstance;
    // where app is a Firebase.FirebaseApp property of your application class.

    // Set a flag here indicating that Firebase is ready to use by your
    // application.
  } else {
    UnityEngine.Debug.LogError(System.String.Format(
      "Could not resolve all Firebase dependencies: {0}", dependencyStatus));
    // Firebase Unity SDK is not safe to use here.
  }
});

Membuat aplikasi Anda

Android

  1. Pilih opsi menu File > Build Settings.
  2. Pilih Android di daftar Platform.
  3. Klik Switch Platform untuk memilih Android sebagai platform target.
  4. Tunggu hingga ikon pemutar (pengompilasi) di sudut kanan bawah status bar Unity berhenti.
  5. Klik Build and Run.

iOS

  1. Pilih opsi menu File > Build Settings.
  2. Pilih iOS di daftar Platform.
  3. Klik Switch Platform untuk memilih iOS sebagai platform target.
  4. Tunggu hingga ikon pemutar (pengompilasi) di sudut kanan bawah status bar Unity berhenti.
  5. Klik Build and Run.

Membuat Struktur Data

Panduan ini mencakup beberapa konsep utama dalam arsitektur data dan praktik terbaik untuk merancang struktur data JSON dalam Firebase Realtime Database.

Membuat database yang terstruktur dengan baik membutuhkan perencanaan yang matang. Yang terpenting, Anda harus merencanakan bagaimana data akan disimpan dan diambil kembali untuk membuat proses tersebut menjadi semudah mungkin.

Metode perancangan struktur data: dengan pohon JSON

Semua data Firebase Realtime Database disimpan sebagai objek JSON. Anda dapat menganggap database sebagai pohon JSON yang dihosting di cloud. Tidak seperti database SQL, database tersebut tidak memiliki tabel atau catatan. Ketika Anda menambahkan data ke pohon JSON, data tersebut akan menjadi node di struktur JSON yang ada dengan kunci terkait. Anda dapat memberikan kunci sendiri, seperti ID pengguna atau nama semantik, atau kunci tersebut dapat diberikan untuk Anda menggunakan metode Push().

Jika Anda membuat kunci sendiri, kunci tersebut harus berenkode UTF-8, berukuran maksimum 768 byte, dan tidak boleh berisi karakter ., $, #, [, ], /, atau karakter kontrol ASCII 0-31 atau 127. Anda juga tidak dapat menggunakan karakter kontrol ASCII dalam nilai-nilai itu sendiri.

Misalnya, bayangkan sebuah aplikasi chat yang memungkinkan pengguna untuk menyimpan profil dasar dan daftar kontak. Profil pengguna biasanya terletak pada suatu lokasi, misalnya /users/$uid. Pengguna alovelace mungkin memiliki entri database yang terlihat seperti ini:

{
  "users": {
    "alovelace": {
      "name": "Ada Lovelace",
      "contacts": { "ghopper": true },
    },
    "ghopper": { ... },
    "eclarke": { ... }
  }
}

Meskipun database ini menggunakan pohon JSON, data yang tersimpan di database dapat digambarkan sebagai jenis bawaan tertentu yang berkaitan dengan jenis JSON yang sudah ada, agar Anda dapat menulis kode yang lebih mudah dikelola.

Praktik terbaik untuk struktur data

Menghindari data bertingkat

Karena Firebase Realtime Database memungkinkan data bertingkat hingga kedalaman 32 tingkat, Anda mungkin akan berpikir bahwa pasti inilah struktur defaultnya. Namun, saat Anda mengambil data di sebuah lokasi dalam database Anda, Anda juga mengambil semua node turunannya. Selain itu, ketika Anda memberikan akses baca atau tulis kepada seseorang pada sebuah node di database Anda, Anda juga memberinya akses ke semua data di dalam node tersebut. Oleh karena itu, dalam praktiknya, lebih baik buat struktur data Anda serata mungkin.

Untuk memberi gambaran mengapa data yang bertingkat itu buruk, perhatikan struktur multi-tingkat berikut:

{
  // This is a poorly nested data architecture, because iterating the children
  // of the "chats" node to get a list of conversation titles requires
  // potentially downloading hundreds of megabytes of messages
  "chats": {
    "one": {
      "title": "Historical Tech Pioneers",
      "messages": {
        "m1": { "sender": "ghopper", "message": "Relay malfunction found. Cause: moth." },
        "m2": { ... },
        // a very long list of messages
      }
    },
    "two": { ... }
  }
}

Dengan desain bertingkat ini, iterasi data bisa bermasalah. Misalnya, untuk menampilkan daftar judul percakapan chat, seluruh hierarki chats harus didownload ke klien, termasuk semua anggota dan pesannya.

Meratakan struktur data

Jika data tersebut dibagi menjadi lokasi yang terpisah, disebut juga dengan denormalisasi, data tersebut dapat didownload secara efisien dalam panggilan terpisah, sesuai dengan kebutuhan. Perhatikan struktur yang diratakan ini:

{
  // Chats contains only meta info about each conversation
  // stored under the chats's unique ID
  "chats": {
    "one": {
      "title": "Historical Tech Pioneers",
      "lastMessage": "ghopper: Relay malfunction found. Cause: moth.",
      "timestamp": 1459361875666
    },
    "two": { ... },
    "three": { ... }
  },

  // Conversation members are easily accessible
  // and stored by chat conversation ID
  "members": {
    // we'll talk about indices like this below
    "one": {
      "ghopper": true,
      "alovelace": true,
      "eclarke": true
    },
    "two": { ... },
    "three": { ... }
  },

  // Messages are separate from data we may want to iterate quickly
  // but still easily paginated and queried, and organized by chat
  // conversation ID
  "messages": {
    "one": {
      "m1": {
        "name": "eclarke",
        "message": "The relay seems to be malfunctioning.",
        "timestamp": 1459361875337
      },
      "m2": { ... },
      "m3": { ... }
    },
    "two": { ... },
    "three": { ... }
  }
}

Iterasi melalui daftar ruang sekarang dapat dilakukan cukup dengan mendownload beberapa byte dari setiap percakapan. Dengan begitu, mengambil metadata untuk pendataan atau menampilkan ruang di UI bisa dilakukan dengan cepat. Pesan dapat diambil secara terpisah dan ditampilkan saat pesan itu tiba, sehingga UI akan tetap cepat dan responsif.

Membuat data yang berkembang

Ketika membuat aplikasi, mendownload subkumpulan dari daftar seringkali merupakan keputusan yang lebih baik. Praktik ini biasa dilakukan, terutama jika daftar tersebut memuat ribuan catatan. Jika hubungan ini bersifat statis dan satu arah, Anda cukup menempatkan objek turunan di bawah induk.

Terkadang, hubungan ini bersifat lebih dinamis, atau denormalisasi mungkin perlu dilakukan pada data ini. Biasanya, denormalisasi data dapat dilakukan dengan menggunakan kueri untuk mengambil subkumpulan data, seperti yang dibahas dalam bagian Mengambil Data.

Tetapi ini pun mungkin tidak cukup. Bayangkan, misalnya, hubungan dua arah antara pengguna dan grup. Pengguna dapat mengikuti sebuah grup, sementara grup terdiri dari daftar pengguna. Keadaan menjadi rumit saat Anda harus menentukan grup mana saja yang diikuti pengguna.

Yang diperlukan adalah cara yang unik untuk mendata grup pengguna dan hanya mengambil data untuk grup tersebut. Indeks grup dapat sangat membantu di sini:

// An index to track Ada's memberships
{
  "users": {
    "alovelace": {
      "name": "Ada Lovelace",
      // Index Ada's groups in her profile
      "groups": {
         // the value here doesn't matter, just that the key exists
         "techpioneers": true,
         "womentechmakers": true
      }
    },
    ...
  },
  "groups": {
    "techpioneers": {
      "name": "Historical Tech Pioneers",
      "members": {
        "alovelace": true,
        "ghopper": true,
        "eclarke": true
      }
    },
    ...
  }
}

Anda mungkin menyadari bahwa tindakan ini akan menduplikat beberapa data dengan cara menyimpan hubungan di catatan Ada maupun di grup. Sekarang, alovelace diindeks dalam grup dan techpioneers tercantum pada profil Ada. Jadi, untuk menghapus Ada dari grup, update harus dilakukan di dua tempat.

Ini adalah redundansi yang diperlukan untuk hubungan dua arah. Dengan begitu, Anda dapat mengambil keanggotaan Ada dengan cepat dan efisien, bahkan ketika daftar pengguna atau grup bertambah menjadi jutaan, atau ketika aturan keamanan Realtime Database menghalangi akses ke beberapa catatan tersebut.

Pendekatan yang membalikkan data dengan mencantumkan ID sebagai kunci dan menetapkan nilainya ke BENAR ini membuat proses pemeriksaan kunci menjadi semudah membaca /users/$uid/groups/$group_id dan memeriksa apakah nilainya null. Indeks ini lebih cepat dan jauh lebih efisien daripada proses kueri atau memindai data.

Langkah Berikutnya

Kirim masukan tentang...

Butuh bantuan? Kunjungi halaman dukungan kami.