Skip to main content

ความแตกต่างระหว่าง Realtime DB และ Firestore DB

Document ต้นฉบับ: https://firebase.google.com/docs/firestore/query-data/listen

อันที่จริงแล้ว Firestore ก็ทำ Realtime ได้ เราจะมาลองเพิ่มการทำ Realtime กันดูบ้าง

เพิ่ม realtime Firestore

เพิ่มการใช้งาน realtime Firestore ด้วย

  • ปรับการดึง Product ให้ realtime แทนที่จะดึงด้วย query ทีละครั้ง
  • เมื่อแก้ไขจาก Backoffice = แสดงข้อมูล product ใหม่ออกมาทันที

แก้เพียงแค่ file เดียวคือ

import { defineStore } from 'pinia'

import {
collection,
getDocs,
query,
where,
onSnapshot // เพิ่มการรับแบบ realtime เข้ามา
} from 'firebase/firestore'

import { db } from '@/firebase'

export const useUserProductStore = defineStore('user-product', {
state: () => ({
list: [],
loaded: false,
page: 1,
limit: 2
}),
actions: {
async loadProduct () {
const productsCol = query(collection(db, 'products'), where('status', '==', 'open'))

onSnapshot(productsCol, (snapshot) => {
this.list = snapshot.docs.map(doc => ({
productId: doc.id,
...doc.data()
}))
})
}
}
})

ผลลัพธ์

firestore-01

ความแตกต่างระหว่าง Realtime DB และ Firestore

Document ต้นฉบับ: https://firebase.google.com/docs/database/rtdb-vs-firestore

ด้วยความที่ Firestore และ Realtime Database นั้นสามารถทำ Realtime ได้เหมือนกัน การพิจารณาว่าจะใช้ Realtime กับ Database แบบไหน ปกติเรามักจะคำนึงถึงเรื่องต่อไปนี้

  1. ในแง่ cost รูปแบบการคิด Cost ของ Realtime DB และ Firestore ต่างกันใหญ่ๆที่ 3 จุดคือ
  • จำนวน connection
    • Realtime DB จะกำหนดไว้สูงสุดอยุ่ที่ 200k / database
    • Firestore ไม่ได้กำหนดในจุดนี้ = connection ไม่จำกัด
  • จำนวนการ Read / Write Database
    • Realtime DB ไม่คิดตาม read / write database (คิดเป็นค่าดึงข้อมูลแทน)
    • Firestore คิดทั้งหมดตั้งแต่ read / write / delete
  • การทำ offline (เมื่อต้อง query บ่อย)
    • Realtime DB ทำได้เป็น basic offline (เหมือน localstorage)
    • Firestore ทำ offline กับ query และทำ sync ได้ (แม้จะเป็น offline mode) = สามารถประหยัด read / write ผ่านการทำสิ่งนี้ (อย่างถูกต้อง) ได้
  1. ในแง่การใช้งาน รูปแบบของ Database ที่เก็บและรูปแบบการดึงข้อมูลมีจุดที่แตกต่างกันคือ
  • Realtime DB: query ไม่ได้ ทำได้เป็นเคสเรียงข้อมูลออกมา
  • Firestore: query ได้ (ตามบท Firestore)

ที่เหลือส่วนตัวมองว่าเป็นจุดพิจารณาทั่วไป (มีแบบถาม / ตอบในเว็บ Firebase ให้ด้วยนะว่า เราเหมาะกับ DB แบบไหน)

ดังนั้น ถ้ามองในแง่ Realtime

  • ถ้าการ Realtime ด้วยข้อมูลขนาดไม่ใหญ่ แต่ต้องมีการอ่านบ่อยๆ เขียนบ่อยๆ = Realtime DB จะ save cost ได้มากกว่า (Firestore จะ save cost ได้แค่ขา read แต่ write ยังคิดเหมือนเดิม)
  • ถ้า Realtime ข้อมูลขนาดใหญ่ และมี query ที่ complex (เช่นการ search) = Firestore + Offline cache (ในหัวข้อ Firebase bundle เราได้มีแนะนำเรื่องนี้เพิ่มเติมไป เพื่อจะไม่โดน cost จากการ query ทุกช็อตได้)