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

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

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

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

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

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

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

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

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

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

แมปข้อมูล

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

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

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

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

แนวทางปฏิบัติแนะนำในการดำเนินการ

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

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

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

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

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

ย้ายข้อมูลย้อนหลังไปยัง Cloud Firestore

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

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

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

  1. ส่งออกข้อมูลจาก Realtime Database หรือ ใช้ข้อมูลสำรองล่าสุด.
    1. ไปที่ส่วน Realtime Databaseในคอนโซล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

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

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

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

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

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

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