Catch up on highlights from Firebase at Google I/O 2023. Learn more

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

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

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

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

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

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

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

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

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

ตรวจสอบให้แน่ใจว่าคุณมีบัญชีสำหรับ การเรียกเก็บเงิน สำหรับทั้ง Realtime Database และ Cloud Firestore

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

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

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

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

  • ข้อความค้นหาตื้นให้ความยืดหยุ่นมากขึ้นในโครงสร้างข้อมูลแบบลำดับชั้น
  • ข้อความค้นหาที่ซับซ้อนมีความละเอียดมากขึ้น และลดความต้องการข้อมูลที่ซ้ำกัน
  • เคอร์เซอร์แบบสอบถามให้เลขหน้าที่มีประสิทธิภาพมากขึ้น
  • การทำธุรกรรมไม่จำเป็นต้องมีรากร่วมสำหรับข้อมูลทั้งหมดของคุณอีกต่อไป และมีประสิทธิภาพมากขึ้น
  • ค่าใช้จ่ายในการเรียกเก็บเงินแตกต่างกันระหว่าง Realtime Database และ 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 Security Rules สำหรับ 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. ส่งออกข้อมูลของคุณจาก Realtime Database หรือ ใช้ข้อมูลสำรองล่าสุด
    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 เมื่อใดก็ตามที่ไคลเอนต์เขียนไปยังฐานข้อมูลเรียลไทม์ ตรวจสอบให้แน่ใจว่า Cloud Firestore ให้ความสำคัญกับข้อมูลใหม่ที่มาจาก Cloud Functions มากกว่าการเขียนใดๆ ที่คุณทำขึ้นจากการย้ายข้อมูลที่ผ่านมา

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

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

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

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

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