Buka konsol

Model Data Cloud Firestore

Cloud Firestore adalah database NoSQL berorientasi dokumen. Tidak seperti database SQL, database tersebut tidak memiliki tabel atau baris. Sebagai gantinya, Anda menyimpan data dalam dokumen, yang disusun menjadi koleksi.

Setiap dokumen berisi kumpulan pasangan kunci/nilai. Cloud Firestore dioptimalkan untuk menyimpan koleksi besar berbagai dokumen kecil.

Semua dokumen harus disimpan dalam koleksi. Dokumen dapat berisi subkoleksi dan objek bertingkat, yang dapat menyertakan kolom standar seperti string atau objek kompleks seperti daftar.

Koleksi dan dokumen dibuat secara implisit di Cloud Firestore. Cukup tetapkan data ke dokumen dalam koleksi. Jika koleksi atau dokumen tidak ada, Cloud Firestore akan membuatnya.

Dokumen

Di Cloud Firestore, unit penyimpanan adalah dokumen. Dokumen adalah data ringan yang berisi kolom, yang dipetakan ke nilai. Setiap dokumen diidentifikasi dengan nama.

Dokumen yang mewakili alovelace pengguna mungkin terlihat seperti ini:

  • class alovelace

    first : "Ada"
    last : "Lovelace"
    born : 1815

Objek kompleks dan bertingkat dalam dokumen disebut peta. Misalnya, Anda dapat membuat struktur nama pengguna dari contoh di atas dengan peta, seperti ini:

  • class alovelace

    name :
        first : "Ada"
        last : "Lovelace"
    born : 1815

Dokumen tersebut mungkin sangat mirip dengan JSON. Sebenarnya, pada dasarnya dokumen tersebut memang JSON. Ada beberapa perbedaan (misalnya, dokumen mendukung jenis data tambahan dan ukurannya terbatas hingga 1 MB). Namun secara umum, Anda dapat memperlakukan dokumen sebagai data JSON ringan.

Koleksi

Dokumen berada dalam koleksi, yang merupakan wadahnya. Misalnya, Anda dapat memiliki koleksi users untuk menampung berbagai pengguna, masing-masing diwakili oleh dokumen:

  • collections_bookmark pengguna

    • class alovelace

      first : "Ada"
      last : "Lovelace"
      born : 1815

    • class aturing

      first : "Alan"
      last : "Turing"
      born : 1912

Cloud Firestore tidak berskema, sehingga Anda bebas memilih kolom apa yang akan dimasukkan ke dalam setiap dokumen, dan jenis data apa yang akan simpan di kolom tersebut. Dokumen dalam koleksi yang sama dapat berisi berbagai kolom, atau menyimpan berbagai jenis data di kolom tersebut. Namun, sebaiknya gunakan kolom dan jenis data yang sama di beberapa dokumen, sehingga Anda dapat membuat kueri dokumen dengan lebih mudah.

Koleksi hanya berisi dokumen. Koleksi tidak dapat langsung berisi kolom mentah dengan nilai, dan tidak dapat berisi koleksi lainnya. (Baca bagian Data Hierarkis untuk mengetahui penjelasan mengenai cara membuat struktur data yang lebih kompleks di Cloud Firestore.)

Nama dokumen dalam koleksi bersifat unik. Anda dapat memasukkan kunci Anda sendiri, seperti ID pengguna, atau Anda dapat membiarkan Cloud Firestore membuat ID acak untuk Anda secara otomatis.

Anda tidak perlu "membuat" atau "menghapus" koleksi. Setelah Anda membuat dokumen pertama dalam koleksi, koleksi tersebut akan tersedia. Jika Anda menghapus semua dokumen dalam koleksi, koleksi tersebut tidak akan tersedia lagi.

Referensi

Setiap dokumen di Cloud Firestore dikenali secara unik berdasarkan lokasinya di dalam database. Contoh sebelumnya menunjukkan dokumen alovelace dalam koleksi users. Untuk merujuk ke lokasi ini dalam kode Anda, buat referensi padanya.

Web
var alovelaceDocumentRef = db.collection('users').doc('alovelace');
Swift
let alovelaceDocumentRef = db.collection("users").document("alovelace")
Objective-C
FIRDocumentReference *alovelaceDocumentRef =
    [[self.db collectionWithPath:@"users"] documentWithPath:@"alovelace"];
Java
DocumentReference alovelaceDocumentRef = db.collection("users").document("alovelace");
Kotlin
val alovelaceDocumentRef = db.collection("users").document("alovelace")
Java
// Reference to a document with id "alovelace" in the collection "users"
DocumentReference document = db.collection("users").document("alovelace");
Python
a_lovelace_ref = db.collection(u'users').document(u'alovelace')
Node.js
let alovelaceDocumentRef = db.collection('users').doc('alovelace');
Go
alovelaceRef := client.Collection("users").Doc("alovelace")
PHP
$document = $db->collection('users')->document('lovelace');
C#
DocumentReference documentRef = db.Collection("users").Document("alovelace");
Ruby
document_ref = firestore.col("users").doc("alovelace")

Referensi adalah objek ringan yang hanya menunjuk ke lokasi di database Anda. Anda dapat membuat referensi saat data ada maupun tidak, dan pembuatan referensi tidak akan melakukan operasi jaringan apa pun.

Anda juga dapat membuat referensi ke koleksi:

Web
var usersCollectionRef = db.collection('users');
Swift
let usersCollectionRef = db.collection("users")
Objective-C
FIRCollectionReference *usersCollectionRef = [self.db collectionWithPath:@"users"];
Java
CollectionReference usersCollectionRef = db.collection("users");
Kotlin
val usersCollectionRef = db.collection("users")
Java
// Reference to the collection "users"
CollectionReference collection = db.collection("users");
Python
users_ref = db.collection(u'users')
Node.js
let usersCollectionRef = db.collection('users');
Go
usersRef := client.Collection("users")
PHP
$collection = $db->collection('users');
C#
CollectionReference collectionRef = db.Collection("users");
Ruby
collection_ref = firestore.col "users"

Demi kenyamanan, Anda juga dapat membuat referensi dengan menentukan lokasi ke dokumen atau koleksi sebagai string dengan komponen lokasi yang dipisahkan garis miring ( / ). Misalnya, untuk membuat referensi ke dokumen alovelace:

Web
var alovelaceDocumentRef = db.doc('users/alovelace');
Swift
let aLovelaceDocumentReference = db.document("users/alovelace")
Objective-C
FIRDocumentReference *aLovelaceDocumentReference =
    [self.db documentWithPath:@"users/alovelace"];
Java
DocumentReference alovelaceDocumentRef = db.document("users/alovelace");
Kotlin
val alovelaceDocumentRef = db.document("users/alovelace")
Java
// Reference to a document with id "alovelace" in the collection "users"
DocumentReference document = db.document("users/alovelace");
Python
a_lovelace_ref = db.document(u'users/alovelace')
Node.js
let alovelaceDocumentRef = db.doc('users/alovelace');
Go
alovelaceRef := client.Doc("users/alovelace")
PHP
$document = $db->document('users/lovelace');
C#
DocumentReference documentRef = db.Document("users/alovelace");
Ruby
document_path_ref = firestore.doc "users/alovelace"

Data Hierarkis

Untuk memahami cara kerja struktur data hierarkis di Cloud Firestore, lihat contoh aplikasi chat dengan pesan dan chat room.

Anda bisa membuat koleksi yang disebut rooms untuk menyimpan berbagai chat room:

  • collections_bookmark rooms

    • class roomA

      name : "my chat room"

    • class roomB

      ...

Setelah menambahkan chat room, tentukan bagaimana cara menyimpan pesan. Anda mungkin tidak ingin menyimpannya di dokumen chat room. Dokumen di Cloud Firestore harus ringan dan chat room bisa berisi sejumlah besar pesan. Namun, Anda dapat membuat koleksi tambahan di dalam dokumen chat room sebagai subkoleksi.

Subkoleksi

Cara terbaik untuk menyimpan pesan dalam skenario ini adalah dengan menggunakan subkoleksi. Subkoleksi adalah koleksi yang terkait dengan dokumen tertentu.

Anda dapat membuat subkoleksi yang disebut messages untuk setiap dokumen di koleksi rooms:

  • collections_bookmark rooms

    • class roomA

      name : "my chat room"

      • collections_bookmark pesan

        • class pesan1

          from : "alex"
          msg : "Hello World!"

        • class pesan2

          ...

    • class roomB

      ...

Dalam contoh ini, Anda akan membuat referensi ke pesan di subkoleksi dengan kode berikut:

Web
var messageRef = db.collection('rooms').doc('roomA')
                .collection('messages').doc('message1');
Swift
let messageRef = db
    .collection("rooms").document("roomA")
    .collection("messages").document("message1")
Objective-C
FIRDocumentReference *messageRef =
    [[[[self.db collectionWithPath:@"rooms"] documentWithPath:@"roomA"]
    collectionWithPath:@"messages"] documentWithPath:@"message1"];
Java
DocumentReference messageRef = db
        .collection("rooms").document("roomA")
        .collection("messages").document("message1");
Kotlin
val messageRef = db
        .collection("rooms").document("roomA")
        .collection("messages").document("message1")
Java
// Reference to a document in subcollection "messages"
DocumentReference document =
    db.collection("rooms").document("roomA").collection("messages").document("message1");
Python
room_a_ref = db.collection(u'rooms').document(u'roomA')
message_ref = room_a_ref.collection(u'messages').document(u'message1')
Node.js
let messageRef = db.collection('rooms').doc('roomA')
  .collection('messages').doc('message1');
Go
messageRef := client.Collection("rooms").Doc("roomA").
	Collection("messages").Doc("message1")
PHP
$document = $db
    ->collection('rooms')
    ->document('roomA')
    ->collection('messages')
    ->document('message1');
C#
DocumentReference documentRef = db
    .Collection("Rooms").Document("RoomA")
    .Collection("Messages").Document("Message1");
Ruby
message_ref = firestore.col("rooms").doc("roomA").col("messages").doc("message1")

Perhatikan pola bergantian antara koleksi dan dokumen. Koleksi dan dokumen Anda harus selalu mengikuti pola ini. Anda tidak dapat membuat referensi koleksi di koleksi atau dokumen di dokumen.

Subkoleksi memungkinkan Anda membuat struktur data secara hierarkis, sehingga data lebih mudah diakses. Untuk mendapatkan semua pesan di roomA, Anda dapat membuat referensi koleksi ke messages subkoleksi dan berinteraksi dengannya sama seperti saat menggunakan referensi koleksi lainnya.

Dokumen dalam subkoleksi juga dapat berisi subkoleksi yang memungkinkan Anda untuk membuat lebih banyak data bertingkat. Anda dapat membuat data bertingkat hingga kedalaman 100 tingkat.