Check out what’s new from Firebase at Google I/O 2022. Learn more

ใช้ Cloud Firestore กับฐานข้อมูลเรียลไทม์ของ Firebase

คุณสามารถใช้ทั้งฐานข้อมูลเรียลไทม์ของ Firebase และ Cloud Firestore ในแอปของคุณ และใช้ประโยชน์จากโซลูชันฐานข้อมูลแต่ละรายการเพื่อให้เหมาะกับความต้องการของคุณ ตัวอย่างเช่น คุณอาจต้องการใช้ประโยชน์จากการสนับสนุนของ Realtime Database สำหรับการแสดงตน ตามที่ระบุไว้ใน Build Presence ใน Cloud Firestore

เรียนรู้เพิ่มเติมเกี่ยวกับความ แตกต่างระหว่างฐานข้อมูล

การย้ายข้อมูลไปยัง Cloud Firestore

หากคุณตัดสินใจว่าต้องการย้ายข้อมูลบางส่วนจากฐานข้อมูลเรียลไทม์ไปยัง Cloud Firestore ให้พิจารณาขั้นตอนต่อไปนี้ เนื่องจากทุกฐานข้อมูลมีความต้องการเฉพาะและการพิจารณาโครงสร้าง จึงไม่มีเส้นทางการโยกย้ายอัตโนมัติ คุณสามารถติดตามความคืบหน้าทั่วไปนี้แทน:

  1. แมปโครงสร้างข้อมูลและกฎความปลอดภัยจาก Realtime Database ไปยัง Cloud Firestore ทั้งฐานข้อมูลแบบเรียลไทม์และ Cloud Firestore ต่างใช้การตรวจสอบสิทธิ์ของ Firebase ดังนั้นคุณไม่จำเป็นต้องเปลี่ยนการตรวจสอบสิทธิ์ผู้ใช้สำหรับแอปของคุณ อย่างไรก็ตาม กฎความปลอดภัยและโมเดลข้อมูลนั้นแตกต่างกัน และสิ่งสำคัญคือต้องพิจารณาความแตกต่างเหล่านั้นอย่างรอบคอบก่อนที่จะเริ่มย้ายข้อมูลไปยัง Cloud Firestore

  2. ย้ายข้อมูลย้อนหลัง ขณะที่คุณกำลังตั้งค่าโครงสร้างข้อมูลใหม่ใน Cloud Firestore คุณสามารถจับคู่และย้ายข้อมูลที่มีอยู่จากฐานข้อมูลเรียลไทม์ไปยังอินสแตนซ์ Cloud Firestore ใหม่ของคุณได้ อย่างไรก็ตาม หากคุณใช้ฐานข้อมูลทั้งสองในแอป คุณไม่จำเป็นต้องย้ายข้อมูลในอดีตออกจากฐานข้อมูลเรียลไทม์

  3. มิเรอร์ข้อมูลใหม่ไปยัง Firestore แบบเรียลไทม์ ใช้ Cloud Functions เพื่อเขียนข้อมูลใหม่ไปยังฐานข้อมูล Cloud Firestore ใหม่ของคุณเมื่อได้รับการเพิ่มลงใน Realtime Database

  4. ทำให้ Cloud Firestore เป็นฐานข้อมูลหลักสำหรับข้อมูลที่ย้าย เมื่อคุณย้ายข้อมูลบางส่วนแล้ว ให้ใช้ Cloud Firestore เป็นฐานข้อมูลหลักและลดการใช้ฐานข้อมูลเรียลไทม์สำหรับข้อมูลที่ย้าย พิจารณาเวอร์ชันของแอปของคุณที่ยังคงเชื่อมโยงกับ Realtime Database สำหรับข้อมูลนั้นและวิธีที่คุณวางแผนจะสนับสนุนต่อไป

ตรวจสอบให้แน่ใจว่าคุณคิดค่าใช้จ่ายใน การเรียกเก็บเงิน สำหรับทั้ง ฐานข้อมูลแบบเรียลไทม์ และ Cloud Firestore

แมปข้อมูลของคุณ

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

ความแตกต่างที่สำคัญที่ต้องพิจารณา

หากคุณย้ายข้อมูลจากแผนผังฐานข้อมูลเรียลไทม์ที่มีอยู่ไปยังเอกสารและคอลเล็กชันของ Cloud Firestore โปรดคำนึงถึงความแตกต่างที่สำคัญต่อไปนี้ระหว่างฐานข้อมูลที่อาจส่งผลต่อวิธีจัดโครงสร้างข้อมูลใน Cloud Firestore

  • การสืบค้นข้อมูลแบบตื้นให้ความยืดหยุ่นมากขึ้นในโครงสร้างข้อมูลแบบลำดับชั้น
  • การสืบค้นข้อมูลที่ซับซ้อนทำให้มีความละเอียดมากขึ้นและลดความจำเป็นในการทำซ้ำข้อมูล
  • เคอร์เซอร์ข้อความค้นหาให้การแบ่งหน้าที่แข็งแกร่งยิ่งขึ้น
  • ธุรกรรมไม่ต้องการรูทร่วมกันสำหรับข้อมูลทั้งหมดของคุณอีกต่อไป และมีประสิทธิภาพมากกว่า
  • ค่าใช้จ่ายในการเรียกเก็บเงินแตกต่างกันระหว่างฐานข้อมูลเรียลไทม์และ Cloud Firestore ในหลายกรณี Cloud Firestore อาจมีราคาแพงกว่า Realtime Database โดยเฉพาะอย่างยิ่งหากคุณพึ่งพาการดำเนินการขนาดเล็กจำนวนมาก พิจารณาลดจำนวนการดำเนินการบนฐานข้อมูลของคุณและหลีกเลี่ยงการเขียนที่ไม่จำเป็น เรียนรู้เพิ่มเติมเกี่ยวกับความแตกต่างใน การเรียกเก็บเงิน ระหว่าง Realtime Database และ Cloud Firestore

แนวปฏิบัติที่ดีที่สุดในการดำเนินการ

ตัวอย่างต่อไปนี้สะท้อนถึงข้อควรพิจารณาบางประการที่คุณอาจทำเมื่อคุณเปลี่ยนข้อมูลระหว่างฐานข้อมูล คุณสามารถใช้ประโยชน์จากการอ่านแบบตื้นและปรับปรุงความสามารถในการสืบค้นสำหรับโครงสร้างข้อมูลที่เป็นธรรมชาติมากกว่าที่คุณเคยใช้กับฐานข้อมูลเรียลไทม์

พิจารณาแอพแนะนำเมืองที่ช่วยให้ผู้ใช้ค้นหาสถานที่สำคัญในเมืองต่างๆ ทั่วโลก เนื่องจาก Realtime Database ขาดการอ่านแบบตื้น คุณอาจต้องจัดโครงสร้างข้อมูลในโหนดระดับบนสุดสองโหนดดังนี้:

// /cities/$CITY_KEY
{
  name: "New York",
  population: 8000000,
  capital: False
}

// /city-landmark/$CITY_KEY/$LANDMARK_KEY
{
  name: "Empire State Building",
  category: "Architecture"
}

Cloud Firestore มีการอ่านแบบตื้น ดังนั้นการสืบค้นเอกสารในคอลเล็กชันจึงไม่ดึงข้อมูลจากคอลเล็กชันย่อย ดังนั้น คุณสามารถเก็บข้อมูลสถานที่สำคัญในคอลเลกชันย่อย:

// /cities/$CITY_ID
{
  name: "New York",
  population: 8000000,
  capital: False,
  landmarks: [... subcollection ...]
}

เอกสารมีขนาดสูงสุด 1MB ซึ่งเป็นอีกเหตุผลหนึ่งในการจัดเก็บจุดสังเกตเป็นคอลเล็กชันย่อย ทำให้เอกสารแต่ละเมืองมีขนาดเล็ก แทนที่จะทำให้เอกสารบวมและมีรายการที่ซ้อนกัน

ความสามารถในการสืบค้นขั้นสูงของ Cloud Firestore ช่วยลดความจำเป็นในการทำซ้ำข้อมูลสำหรับรูปแบบการเข้าถึงทั่วไป ตัวอย่างเช่น พิจารณาหน้าจอในแอพแนะนำเมืองที่แสดงเมืองหลวงทั้งหมดเรียงตามจำนวนประชากร ในฐานข้อมูลเรียลไทม์ วิธีที่มีประสิทธิภาพที่สุดในการทำเช่นนี้คือการรักษารายชื่อเมืองหลวงแยกต่างหากที่คัดลอกข้อมูลจากรายการ cities ดังนี้:

{
   cities: {
    // ...
   },

   capital-cities: {
     // ...
   }
}

ใน Cloud Firestore คุณสามารถแสดงรายการเมืองหลวงโดยเรียงตามจำนวนประชากรเป็นข้อความค้นหาเดียว:

db.collection('cities')
    .where('capital', '==', true)
    .orderBy('population')

อ่านเพิ่มเติมเกี่ยวกับ โมเดลข้อมูล Cloud Firestore และดู โซลูชัน ของเราสำหรับแนวคิดเพิ่มเติมเกี่ยวกับวิธีจัดโครงสร้างฐานข้อมูล Cloud Firestore ของคุณ

รักษาความปลอดภัยข้อมูลของคุณ

ไม่ว่าคุณจะใช้ กฎความปลอดภัยของ Cloud Firestore สำหรับ Android, Apple หรือไคลเอ็นต์เว็บ หรือ Identity Access Management (IAM) สำหรับเซิร์ฟเวอร์ ให้ตรวจสอบว่าคุณรักษาความปลอดภัยข้อมูลใน Cloud Firestore และ Realtime Database การตรวจสอบสิทธิ์ผู้ใช้ได้รับการจัดการโดยการตรวจสอบสิทธิ์สำหรับฐานข้อมูลทั้งสอง ดังนั้นคุณไม่จำเป็นต้องเปลี่ยนการใช้งานการตรวจสอบสิทธิ์เมื่อคุณเริ่มใช้ Cloud Firestore

ความแตกต่างที่สำคัญที่ต้องพิจารณา

  • SDK อุปกรณ์เคลื่อนที่และเว็บใช้กฎความปลอดภัยของ Cloud Firestore ในขณะที่ SDK เซิร์ฟเวอร์ใช้ Identity Access Management (IAM) เพื่อรักษาความปลอดภัยข้อมูล
  • กฎความปลอดภัยของ Cloud Firestore จะไม่เรียงต่อกัน เว้นแต่คุณจะใช้ไวด์การ์ด เอกสารและคอลเล็กชันจะไม่สืบทอดกฎเกณฑ์
  • คุณไม่จำเป็นต้องตรวจสอบข้อมูลแยกกันอีกต่อไป (เหมือนที่คุณทำใน Realtime Database )
  • Cloud Firestore ตรวจสอบกฎก่อนดำเนินการค้นหาเพื่อให้แน่ใจว่าผู้ใช้มีสิทธิ์เข้าถึงที่เหมาะสมสำหรับข้อมูลทั้งหมดที่ส่งคืนโดยคำค้นหา

ย้ายข้อมูลประวัติไปยัง Cloud Firestore

เมื่อคุณจับคู่โครงสร้างข้อมูลและความปลอดภัยกับข้อมูลและโมเดลความปลอดภัยของ Cloud Firestore แล้ว คุณจะเริ่มเพิ่มข้อมูลได้ หากคุณวางแผนที่จะสืบค้นข้อมูลประวัติหลังจากที่คุณย้ายแอปจากฐานข้อมูลเรียลไทม์ไปยัง Cloud Firestore ให้เพิ่มการส่งออกข้อมูลเก่าไปยังฐานข้อมูล Cloud Firestore ใหม่ หากคุณวางแผนที่จะใช้ทั้ง Realtime Database และ Cloud Firestore ในแอปของคุณ คุณสามารถข้ามขั้นตอนนี้ได้

เพื่อหลีกเลี่ยงการเขียนทับข้อมูลใหม่ด้วยข้อมูลเก่า คุณอาจต้องการเพิ่มข้อมูลประวัติของคุณก่อน หากคุณเพิ่มข้อมูลใหม่ลงในฐานข้อมูลทั้งสองพร้อมกัน ตามที่กล่าวไว้ในขั้นตอนถัดไป ตรวจสอบให้แน่ใจว่าคุณให้ความสำคัญกับข้อมูลใหม่ที่เพิ่มไปยัง Cloud Firestore โดย Cloud Functions

หากต้องการย้ายข้อมูลประวัติไปยัง Cloud Firestore ให้ทำตามขั้นตอนเหล่านี้:

  1. ส่งออกข้อมูลของคุณจากฐานข้อมูลเรียลไทม์หรือ ใช้ข้อมูลสำรองล่าสุด
    1. ไปที่ ส่วนฐานข้อมูลเรียลไทม์ ในคอนโซล Firebase
    2. จากแท็บ ข้อมูล เลือกโหนดระดับรูทของฐานข้อมูลและเลือก ส่งออก JSON จากเมนู
  2. สร้างฐานข้อมูลใหม่ใน Cloud Firestore และ เพิ่มข้อมูลของคุณ

    พิจารณากลยุทธ์ต่อไปนี้เมื่อคุณย้ายข้อมูลบางส่วนไปยัง Cloud Firestore:

    • เขียนสคริปต์แบบกำหนดเองที่พอร์ตข้อมูลของคุณ แม้ว่าเราจะไม่สามารถเสนอเทมเพลตสำหรับสคริปต์นี้ได้ เนื่องจากทุกฐานข้อมูลจะมีความต้องการเฉพาะ ผู้เชี่ยวชาญ Cloud Firestore บน แชนเนล Slack ของเราหรือบน Stack Overflow สามารถตรวจสอบสคริปต์ของคุณหรือให้คำแนะนำสำหรับสถานการณ์เฉพาะของคุณได้
    • ใช้เซิร์ฟเวอร์ SDK (Node.js, Java, Python หรือ Go) เพื่อเขียนข้อมูลไปยัง Cloud Firestore โดยตรง สำหรับคำแนะนำในการตั้งค่าเซิร์ฟเวอร์ SDK โปรดดูที่ เริ่มต้น ใช้งาน
    • หากต้องการเร่งการย้ายข้อมูลขนาดใหญ่ ให้ใช้การ เขียน แบบกลุ่มและส่งการดำเนินการสูงสุด 500 รายการในคำขอเครือข่ายเดียว
    • หากต้องการอยู่ภายใต้ ขีดจำกัดอัตรา Cloud Firestore ให้จำกัดการดำเนินการไว้ที่ 500 เขียน/วินาทีสำหรับแต่ละคอลเล็กชัน

เพิ่มข้อมูลใหม่ไปยัง Cloud Firestore

เพื่อรักษาความเท่าเทียมกันระหว่างฐานข้อมูลของคุณ ให้เพิ่มข้อมูลใหม่ลงในฐานข้อมูลทั้งสองแบบเรียลไทม์ ใช้ Cloud Functions เพื่อทริกเกอร์การเขียนไปยัง Cloud Firestore ทุกครั้งที่ไคลเอ็นต์เขียนลงใน Realtime Database ตรวจสอบให้แน่ใจว่า Cloud Firestore ให้ความสำคัญกับข้อมูลใหม่ที่มาจาก Cloud Functions มากกว่าการเขียนใดๆ ที่คุณสร้างขึ้นจากการย้ายข้อมูลในอดีต

สร้างฟังก์ชันเพื่อเขียนใหม่หรือเปลี่ยนแปลงข้อมูลไปยัง Cloud Firestore ทุกครั้งที่ไคลเอ็นต์เขียนข้อมูลลงใน Realtime Database เรียนรู้เพิ่มเติมเกี่ยวกับ ทริกเกอร์ฐานข้อมูลเรียลไทม์ สำหรับฟังก์ชันระบบคลาวด์

ทำให้ Cloud Firestore เป็นฐานข้อมูลหลักสำหรับข้อมูลที่ย้ายมา

หากคุณตัดสินใจใช้ Cloud Firestore เป็นฐานข้อมูลหลักสำหรับข้อมูลบางส่วน ให้ตรวจสอบว่าคุณได้พิจารณาฟังก์ชันการสะท้อนข้อมูลที่คุณตั้งค่าและตรวจสอบกฎความปลอดภัยของ Cloud Firestore แล้ว

  1. หากคุณใช้ Cloud Functions เพื่อรักษาความเท่าเทียมกันระหว่างฐานข้อมูลของคุณ ตรวจสอบให้แน่ใจว่าคุณไม่ได้ทำการเขียนซ้ำในฐานข้อมูลทั้งสองแบบในลูป สลับฟังก์ชันของคุณเพื่อเขียนลงในฐานข้อมูลเดียว หรือลบฟังก์ชันทั้งหมด และเริ่มเลิกใช้ฟังก์ชันการเขียนสำหรับข้อมูลที่ย้ายในแอปที่ยังคงเชื่อมโยงกับ Realtime Database วิธีจัดการสิ่งนี้สำหรับแอปของคุณขึ้นอยู่กับความต้องการเฉพาะและผู้ใช้ของคุณ

  2. ตรวจสอบว่าข้อมูลของคุณได้รับการรักษาความปลอดภัยอย่างถูกต้อง ตรวจสอบกฎความปลอดภัยของ Cloud Firestore หรือการตั้งค่า IAM