วิธีที่ดีที่สุดในการเพิ่มประสิทธิภาพและปรับขนาดข้อมูลใน Firebase Realtime Database คือการแยกข้อมูลออกเป็นอินสแตนซ์ Realtime Database หลายรายการ หรือที่เรียกว่า การแบ่งส่วนฐานข้อมูล การแบ่งส่วนช่วยให้คุณปรับขนาดได้เกินขีดจำกัดที่ใช้กับอินสแตนซ์ฐานข้อมูลแต่ละรายการ นอกเหนือจากการปรับสมดุลโหลดและการเพิ่มประสิทธิภาพ
กรณีที่ควรแบ่งส่วนข้อมูล
คุณอาจต้องการแบ่งส่วนข้อมูลออกเป็นฐานข้อมูลหลายรายการหากใช้ Realtime Database และเข้าข่ายสถานการณ์ต่อไปนี้
- คุณต้องการปรับขนาดให้เกินขีดจำกัดของการเชื่อมต่อพร้อมกัน 200,000 รายการ, การดำเนินการเขียน 1,000 รายการ/วินาที หรือขีดจำกัดอื่นๆ สำหรับอินสแตนซ์ฐานข้อมูลเดียว
- คุณมีชุดข้อมูลหลายชุดที่แยกจากกันและต้องการเพิ่มประสิทธิภาพ (เช่น แอปแชทที่ให้บริการกลุ่มผู้ใช้ที่แยกกันและเป็นอิสระ)
- คุณต้องการปรับสมดุลโหลดในฐานข้อมูลหลายรายการเพื่อเพิ่มเวลาทำงานและลดความเสี่ยงที่จะเกิดการโหลดมากเกินไปในอินสแตนซ์ฐานข้อมูลเดียว
วิธีแบ่งส่วนข้อมูล
หากต้องการแบ่งส่วนข้อมูล ให้ทำตามขั้นตอนต่อไปนี้ (อธิบายรายละเอียดเพิ่มเติมด้านล่าง)
- แมปข้อมูลกับฐานข้อมูลหลายรายการตามความต้องการเฉพาะของแอป
- สร้างอินสแตนซ์ฐานข้อมูลหลายรายการ
- กำหนดค่าแอปให้เชื่อมต่อกับอินสแตนซ์ Realtime Database ที่จำเป็น สำหรับชุดข้อมูลแต่ละชุด
แมปข้อมูล
เมื่อแมปข้อมูลกับฐานข้อมูลหลายรายการ ให้พยายามทำตามเงื่อนไขต่อไปนี้
- แต่ละคําค้นหาจะทํางานกับอินสแตนซ์ฐานข้อมูลเดียวเท่านั้น Realtime Database ไม่รองรับการค้นหาในอินสแตนซ์ฐานข้อมูล
- ไม่มีการแชร์หรือทำข้อมูลซ้ำในอินสแตนซ์ฐานข้อมูล (หรือมีการแชร์หรือทำข้อมูลซ้ำน้อยที่สุด)
- อินสแตนซ์แอปแต่ละรายการจะเชื่อมต่อกับฐานข้อมูลเดียวเท่านั้นในแต่ละครั้ง
ขณะแมปข้อมูล ให้พิจารณาใช้กลยุทธ์ต่อไปนี้
สร้าง "ส่วนหลัก"
จัดเก็บแผนผังวิธีจัดเก็บข้อมูลในอินสแตนซ์ฐานข้อมูล วิธีนี้ช่วยให้คุณค้นหาอินสแตนซ์ฐานข้อมูลที่ตรงกับไคลเอ็นต์ที่เชื่อมต่อได้โดยใช้โปรแกรม โปรดทราบว่าวิธีนี้อาจมีค่าใช้จ่ายมากกว่าการเชื่อมต่อโดยตรงกับอินสแตนซ์ฐานข้อมูลที่ต้องการเมื่อคุณต้องการ
จัดกลุ่มข้อมูลตามหมวดหมู่หรือตามลูกค้า
จัดเก็บข้อมูลในอินสแตนซ์ฐานข้อมูลที่แยกกัน โดยจัดกลุ่มตามผู้ใช้หรือประเภทข้อมูล ตัวอย่างเช่น หากคุณสร้างแอปพลิเคชันแชทที่ให้บริการหลายองค์กร คุณสามารถสร้างอินสแตนซ์ฐานข้อมูลสำหรับแต่ละองค์กรและจัดเก็บข้อมูลแชททั้งหมดในอินสแตนซ์ฐานข้อมูลที่ไม่ซ้ำกัน
ในกรณีนี้ องค์กร ก. และองค์กร ข. จะไม่แชร์ข้อมูล ไม่มีข้อมูลซ้ำในฐานข้อมูล และคุณจะทำการค้นหากับอินสแตนซ์ฐานข้อมูลเดียวเท่านั้น นอกจากนี้ ผู้ใช้ในแต่ละองค์กรจะเชื่อมต่อกับฐานข้อมูลขององค์กรเมื่อใช้แอปแชทเท่านั้น
จากนั้นคุณสามารถสร้างอินสแตนซ์ฐานข้อมูลหลายรายการล่วงหน้าและใช้รหัสขององค์กรเพื่อแมปทีมกับอินสแตนซ์ฐานข้อมูล เช่น องค์กร ก. จะแมปกับ Realtime Database ก.
วิธีแมปข้อมูลสำหรับแอปจะขึ้นอยู่กับกรณีการใช้งานเฉพาะของคุณ แต่เงื่อนไขและกลยุทธ์ที่ระบุไว้ข้างต้นจะช่วยให้คุณกำหนดสิ่งที่เหมาะกับข้อมูลของคุณได้
สร้างอินสแตนซ์หลายรายการRealtime Database
หากใช้แพ็กเกจราคา Blaze คุณจะสร้างอินสแตนซ์ฐานข้อมูลได้สูงสุด 1,000 รายการในโปรเจ็กต์ Firebase เดียวกัน

ในคอนโซล Firebase ให้ไปที่แท็บฐานข้อมูลและพื้นที่เก็บข้อมูล > Realtime Database > ข้อมูล
เลือกสร้างฐานข้อมูลใหม่ จากเมนูแบบเลื่อนลง
ปรับแต่งข้อมูลอ้างอิงฐานข้อมูล และ Security Rules แล้วคลิก ตกลง
ทำกระบวนการซ้ำเพื่อสร้างอินสแตนซ์ฐานข้อมูลตามจำนวนที่ต้องการ อินสแตนซ์ฐานข้อมูลแต่ละรายการจะมีชุดFirebase Realtime Database Security Rulesเป็นของตัวเอง คุณจึง ปรับแต่งการเข้าถึงข้อมูลได้
คุณสามารถสร้างและจัดการอินสแตนซ์ฐานข้อมูลในคอนโซล Firebase หรือใช้ Realtime Database Management REST API
จัดการและโต้ตอบกับอินสแตนซ์ที่เฉพาะเจาะจงโดยใช้ CLI
คุณสามารถจัดการและโต้ตอบกับอินสแตนซ์ Realtime Database ที่เฉพาะเจาะจงได้โดยใช้ Firebase CLI
โดยค่าเริ่มต้น คำสั่ง CLI จะโต้ตอบกับอินสแตนซ์ฐานข้อมูล เริ่มต้น อย่างไรก็ตาม คุณสามารถโต้ตอบกับอินสแตนซ์ฐานข้อมูล ที่ไม่ใช่ค่าเริ่มต้น
ได้โดยใช้
--instance DATABASE_NAME
ตัวอย่างเช่น ใช้คำสั่งต่อไปนี้เพื่อเรียกใช้โปรไฟล์เลอร์สำหรับอินสแตนซ์ฐานข้อมูลที่ชื่อ my-example-shard.firebaseio.com
firebase database:profile --instance "my-example-shard"
คำสั่งต่อไปนี้รองรับแฟล็ก --instance
firebase database:getfirebase database:profilefirebase database:pushfirebase database:removefirebase database:setfirebase database:update
แก้ไขและติดตั้งใช้งาน Realtime Database Security Rules สำหรับแต่ละอินสแตนซ์
ตรวจสอบว่า Realtime Database Security Rules อนุญาตให้เข้าถึงอินสแตนซ์ฐานข้อมูลแต่ละรายการในโปรเจ็กต์ได้อย่างเหมาะสม ฐานข้อมูลแต่ละรายการจะมีชุดกฎของตัวเอง ซึ่งคุณสามารถแก้ไขและติดตั้งใช้งานจากคอนโซล Firebase หรือใช้ Firebase CLI เพื่อติดตั้งใช้งานเป้าหมาย
หากต้องการแก้ไขและติดตั้งใช้งานกฎจากคอนโซล Firebase ให้ทำตามขั้นตอนต่อไปนี้
ในคอนโซล Firebase ให้ไปที่แท็บฐานข้อมูลและพื้นที่เก็บข้อมูล > Realtime Database > กฎ
เลือกฐานข้อมูลที่ต้องการแก้ไข แล้วแก้ไขกฎ
หากต้องการแก้ไขและติดตั้งใช้งานกฎจาก Firebase CLI ให้ทำตามขั้นตอนต่อไปนี้
แก้ไขกฎในไฟล์กฎสำหรับอินสแตนซ์ฐานข้อมูล (เช่น
foo.rules.json)สร้างและใช้เป้าหมายการติดตั้งใช้งานเพื่อเชื่อมโยงฐานข้อมูลที่ใช้ไฟล์กฎเดียวกัน ตัวอย่างเช่น
firebase target:apply database main my-db-1 my-db-2
firebase target:apply database other my-other-db-3
อัปเดตไฟล์การกำหนดค่า
firebase.jsonด้วยเป้าหมายการติดตั้งใช้งาน{ "database": [ {"target": "main", "rules": "foo.rules.json"}, {"target": "other", "rules": "bar.rules.json"} ] }เรียกใช้คำสั่งติดตั้งใช้งาน
firebase deploy
ตรวจสอบว่าคุณแก้ไขและติดตั้งใช้งานกฎจากที่เดียวกันอย่างสม่ำเสมอ การติดตั้งใช้งาน กฎจาก Firebase CLI จะลบล้างการแก้ไขที่คุณทำใน Firebase คอนโซล และการแก้ไขกฎโดยตรงใน Firebase คอนโซล จะลบล้างการเปลี่ยนแปลงล่าสุดที่คุณติดตั้งใช้งานผ่าน Firebase CLI
เชื่อมต่อแอปกับอินสแตนซ์ฐานข้อมูลหลายรายการ
ใช้ข้อมูลอ้างอิงฐานข้อมูลเพื่อเข้าถึงข้อมูลที่จัดเก็บไว้ในอินสแตนซ์ฐานข้อมูลรอง คุณสามารถรับข้อมูลอ้างอิงสำหรับอินสแตนซ์ฐานข้อมูลที่เฉพาะเจาะจงได้โดยใช้ URL หรือแอป หากไม่ระบุ URL คุณจะได้รับข้อมูลอ้างอิงสำหรับอินสแตนซ์ฐานข้อมูลเริ่มต้นของแอป
Web
import { initializeApp } from "firebase/app"; import { getDatabase } from "firebase/database"; const app1 = initializeApp({ databaseURL: "https://testapp-1234-1.firebaseio.com" }); const app2 = initializeApp({ databaseURL: "https://testapp-1234-2.firebaseio.com" }, 'app2'); // Get the default database instance for an app1 const database1 = getDatabase(app1); // Get a database instance for app2 const database2 = getDatabase(app2);
Web
const app1 = firebase.initializeApp({ databaseURL: "https://testapp-1234-1.firebaseio.com" }); const app2 = firebase.initializeApp({ databaseURL: "https://testapp-1234-2.firebaseio.com" }, 'app2'); // Get the default database instance for an app1 var database1 = firebase.database(); // Get a database instance for app2 var database2 = firebase.database(app2);
Swift
// Get the default database instance for an appvar ref: DatabaseReference! ref = Database.database().reference()
Objective-C
// Get the default database instance for an app@property (strong, nonatomic) FIRDatabaseReference *ref; self.ref = [[FIRDatabase database] reference];
Kotlin
// Get the default database instance for an app val primary = Firebase.database.reference // Get a secondary database instance by URL val secondary = Firebase.database("https://testapp-1234.firebaseio.com").reference
Java
// Get the default database instance for an app DatabaseReference primary = FirebaseDatabase.getInstance() .getReference(); // Get a secondary database instance by URL DatabaseReference secondary = FirebaseDatabase.getInstance("https://testapp-1234.firebaseio.com") .getReference();
เพิ่มประสิทธิภาพการเชื่อมต่อในฐานข้อมูลแต่ละรายการ
หากไคลเอ็นต์แต่ละรายการต้องเชื่อมต่อกับฐานข้อมูลหลายรายการระหว่างเซสชัน คุณสามารถลดจำนวนการเชื่อมต่อพร้อมกันกับอินสแตนซ์ฐานข้อมูลแต่ละรายการได้โดยการเชื่อมต่อกับอินสแตนซ์ฐานข้อมูลแต่ละรายการเฉพาะเมื่อจำเป็นเท่านั้น
รับคำแนะนำเพิ่มเติม
หากต้องการความช่วยเหลือเพิ่มเติมในการแบ่งส่วนข้อมูลออกเป็นอินสแตนซ์ฐานข้อมูลหลายรายการ โปรดติดต่อผู้เชี่ยวชาญของ Firebase ใน ช่อง Slack หรือใน Stack Overflow