Join us in person and online for Firebase Summit on October 18, 2022. Learn how Firebase can help you accelerate app development, release your app with confidence, and scale with ease. Register now

ใช้ 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

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

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

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

// /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 แล้ว คุณจะเริ่มเพิ่มข้อมูลได้ หากคุณวางแผนที่จะสืบค้นข้อมูลประวัติหลังจากที่คุณย้ายแอปจาก Realtime Database ไปยัง 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