Pendahuluan
Untuk menyegarkan kembali ingatan tentang SQL, kita akan buat tabel perbandingan antara SQL dan NoSQL
| SQL | NoSQL |
|---|---|
| Berisi entitas yang memiliki relasi. | Dokumen disimpan berdasarkan hierarki collection. |
| Skema strict. | Memiliki skema lebih flexible. |
| Mendukung query yang kompleks. | Mendukung query yang lebih sederhana. |
| Biasanya hanya mendukung scale vertically (menambahkan RAM dan CPU, bukanya menambahkan instance). | Mendukung scale horizontally. |
Fitur Google Cloud Firestore
Google Cloud Firestore menggantikan produk terdahulu yaitu Cloud Datastore. Perbandingannya adalah produk amazon DynamoDB.
- Fully managed NoSQL database, Serverless autoscalling NoSQL document store. Artinya dari sisi pengguna, kita tidak perlu membuat instance dan melakukan konfigurasi, cukup mengakses service yang disediakan. Terintegrasi penuh dengan produk dan service GCP lainnya, termasuk Firebase, Google Mobile Development Platform.
- Realtime DB dengan SDK untuk mobile, mendukung Android dan IOS. Realtime artinya aplikasi pada mobile device dapat langsung dinotifikasi jika terjadi perubahan pada database. Juga mendukung offline akses.
- Scalability dan consistency, mendukung horizontal scalling dan konsistensi tinggi serta ACID transactions.
Firestore Data Model
Firestore menyimpan document dalam bentuk JSON. Contoh:
{
"name": "Foo-bar",
"address": "Jl. Aspal no 100",
"favorite":
["kopi tubruk", "goreng pisang"]
}
Ketika Anda memiliki document dengan data yang sama, documet tersebut dibundle menjadi collection. Contohnya, Anda menjalankan web based chat service. Terdapat dua colection yaitu Rooms dan Users.
Dalam Rooms collection, terdapat document chat room. Sementara pada Users collection berisi document yang menggunakan service.

Menggunakan contoh ini, kita dapat menyimpan message chat room dalam room document. Karena Firestore adalah bersifat hirarki, document juga dapat menyimpan collection yang disebut sub-collection.
Hierarki ini dapat terus berlanjut, setiap document dari sub-collection dapat memiliki sub-collection juga. Nesting dapat dilakukan hingga 100 kedalaman.

Fitur lain dari Firestore data model adalah references. Contohnya, user sedang dalam sebuah chat room, kita tidak perlu menyimpan user document pada rooms document tersebut. Karena bisa saja user berganti room, atau berada di beberapa rooms.
Pendekatan yang dilakukan adalah membuat list dalam room document yang berisi reference terhadap user. Anda dapat bayangkan references sebagai pointer ke document lainnya.

Firestore data types
Firestore mendukung tipe data:
- String, integer, boolean, float dan null.
- Bytes, date and time, geographical point.
- Array dan map.
- References
Manipulasi data Firestore
Add Data
Untuk menambahkan data kedalam Firestore cukup sederhana, yaitu membuat document baru dengan identifier (kita bisa definisikan sendiri nilai unik atau otomatis dilakukan oleh Firestore).
Berikut ilustrasi sederhana menggunakan Python untuk menambah data: Contoh pertama menggunakan unique identifier yang kedua identifier otomatis dari Firestore
#contoh 1
info = {
u'name' : u'Jean Luc Picard',
u'rank' : u'Captain',
u'serialNumber' : 123,
}
db.collection(u'crew').document(u'jeanluc').set(info)
#contoh 2
info = {
u'name' : u'William Riker',
u'rank' : u'Commander',
u'serialNumber' : 124,
}
db.collection(u'crew').add (info.to_dict())
Update Data
Untuk pdate document digunakan identifier sebagai referensi. Contoh update document menggunakan Python:
picard_ref = db.collection(u'crew').document(u'jeanluc')
picard_ref.update({
u'rank' : u'Admiral'
})
Delete Document dan Field
Berikut contoh delete document dan delete field menggunakan Python:
#delete document
picard_ref = db.collection(u'crew').document(u'jeanluc')
picard_ref.delete()
#delete fields dalam document
picard_ref.update({
u'serialNumber' : firestore.DELETE_FIELD
})
Retrieve data
Untuk retrieve terdapat beberapa cara:
- Menggunakan ID.
- Seluruh documents dalam collection.
- Query menggunakan WHERE.
#retrieve by ID
picard = db.collection(u'crew').document(u'jeanluc').get(info)
print(u'Crew data: {}'.format(picard.to_dict()))
#retrieve all documents
all_crew = db.collection(u'crew').stream()
for crew_member in all_crew:
print(u'{} => {}'.format(crew_member.id, crew_member.to_dict()))
#retrieve menggunakan WHERE
commanders = db.collection(u'crew).where(u'rank', u'==', u'Commander').stream()
for crew_member in commanders:
print(u'{} => {}'.format(crew_member.id, crew_member.to_dict()))
WHERE clause dapat berupa:
- Comparison operator sederhana.
- array-contains.
- Compound queries.
Firestore Indexes
Indexes berupa single-field yang dibuat secara otomatis oleh Firestore untuk setiap field dalam document dan subfiled dalam map.
Ini berarti kita dapat melakukan query untuk semua field dan tetap memiliki performa query yang baik.
Untuk meningkat performa, Anda juga bisa spesifikasikan index yang tidak diperlukan untuk field tertentu, misalnya field dengan large string, array atau map.
Firestore juga mendukung composite indexes. Hal ini mendukung compound query
Realtime Update
Gunakan on_snapshot functions untuk “mendengarkan” perubahan. Callback function akan digunakan untuk melakukan suatu tindakan ketika update terjadi.
Tipe update juga dikirimkan ke callback function, berguna jika terdapat bisnis proses yang perlu dilakukan ketika menangani event perubahan.