วิธีที่ดีที่สุดในการเพิ่มประสิทธิภาพและปรับขนาดข้อมูลใน Firebase Realtime Database คือการแยกข้อมูลออกเป็นหลายRealtime Databaseอินสแตนซ์ หรือที่เรียกว่า การแบ่งฐานข้อมูล การแบ่งข้อมูลช่วยให้คุณปรับขนาดได้เกินขีดจํากัดที่ใช้กับอินสแตนซ์ฐานข้อมูลแต่ละรายการ นอกเหนือจากการปรับสมดุลการรับส่งและการเพิ่มประสิทธิภาพ
เวลาที่ควรทำการ Shard ข้อมูล
คุณอาจต้องการแบ่งข้อมูลในฐานข้อมูลหลายรายการหากใช้ Realtime Databaseและอยู่ในสถานการณ์ต่อไปนี้
- คุณต้องการขยายขนาดเกินขีดจำกัดของการเชื่อมต่อพร้อมกัน 200,000 รายการ การดำเนินการเขียน 1,000 รายการ/วินาที หรือขีดจำกัดอื่นๆ สำหรับอินสแตนซ์ฐานข้อมูลเดียว
- คุณมีชุดข้อมูลที่แยกกันหลายชุดและต้องการเพิ่มประสิทธิภาพ (เช่น แอปแชทที่ให้บริการแก่กลุ่มผู้ใช้ที่แยกกันและเป็นอิสระ)
- คุณต้องการกระจายภาระงานในฐานข้อมูลหลายรายการเพื่อปรับปรุงเวลาทํางานและ ลดความเสี่ยงของการโอเวอร์โหลดอินสแตนซ์ฐานข้อมูลเดียว
วิธีแบ่งข้อมูล
หากต้องการแบ่งข้อมูล ให้ทำตามขั้นตอนต่อไปนี้ (อธิบายรายละเอียดเพิ่มเติมด้านล่าง)
- แมปข้อมูลกับฐานข้อมูลหลายรายการตามความต้องการเฉพาะของแอป
- สร้างอินสแตนซ์ฐานข้อมูลหลายรายการ
- กำหนดค่าแอปให้เชื่อมต่อกับอินสแตนซ์ Realtime Database ที่จำเป็น สำหรับแต่ละชุดข้อมูล
แมปข้อมูล
เมื่อแมปข้อมูลกับฐานข้อมูลหลายรายการ ให้พยายามปฏิบัติตาม เงื่อนไขต่อไปนี้
- การค้นหาแต่ละครั้งจะทํางานกับอินสแตนซ์ฐานข้อมูลเดียวเท่านั้น Realtime Database ไม่รองรับการค้นหาในอินสแตนซ์ฐานข้อมูล
- ไม่มีการแชร์หรือทำซ้ำข้อมูลในอินสแตนซ์ฐานข้อมูล (หรือมีการแชร์หรือทำซ้ำน้อยที่สุด)
- อินสแตนซ์แอปแต่ละรายการจะเชื่อมต่อกับฐานข้อมูลได้เพียงรายการเดียวในเวลาใดก็ตาม
ขณะแมปข้อมูล ให้พิจารณาใช้กลยุทธ์ต่อไปนี้
สร้าง "ชาร์ดหลัก"
จัดเก็บแผนที่ของวิธีจัดเก็บข้อมูลในอินสแตนซ์ฐานข้อมูล วิธีนี้ช่วยให้คุณค้นหาอินสแตนซ์ฐานข้อมูลที่สอดคล้องกับไคลเอ็นต์ที่เชื่อมต่อได้โดยอัตโนมัติ โปรดทราบว่าการดำเนินการนี้อาจ มีค่าใช้จ่ายมากกว่าการเชื่อมต่อโดยตรงกับอินสแตนซ์ ฐานข้อมูลที่ต้องการเมื่อคุณต้องการ
จัดกลุ่มข้อมูลตามหมวดหมู่หรือตามลูกค้า
จัดเก็บข้อมูลในอินสแตนซ์ฐานข้อมูลที่แยกกันเป็นส่วนๆ โดยจัดกลุ่มตามผู้ใช้หรือประเภทข้อมูล เช่น หากคุณสร้างแอปพลิเคชันแชทที่ให้บริการหลายองค์กร คุณจะสร้างอินสแตนซ์ฐานข้อมูลสำหรับแต่ละองค์กรและจัดเก็บข้อมูลแชททั้งหมด ในอินสแตนซ์ฐานข้อมูลที่ไม่ซ้ำกันได้
ในกรณีนี้ องค์กร ก. และองค์กร ข. จะไม่แชร์ข้อมูล ไม่มีข้อมูลที่ซ้ำกันในฐานข้อมูล และคุณจะเรียกใช้การค้นหาในอินสแตนซ์ฐานข้อมูลเดียวเท่านั้น นอกจากนี้ ผู้ใช้ในแต่ละองค์กรจะเชื่อมต่อกับฐานข้อมูลขององค์กรได้ก็ต่อเมื่อใช้แอปแชทเท่านั้น
จากนั้นคุณสามารถสร้างอินสแตนซ์ฐานข้อมูลหลายรายการล่วงหน้าและใช้รหัสขององค์กรเพื่อแมปทีมกับอินสแตนซ์ฐานข้อมูลของทีม เช่น องค์กร ก แมปกับ Realtime Database ก
วิธีแมปข้อมูลสำหรับแอปจะขึ้นอยู่กับกรณีการใช้งานของคุณ แต่ เงื่อนไขและกลยุทธ์ที่ระบุไว้ข้างต้นจะช่วยให้คุณกำหนดได้ว่าอะไรที่เหมาะกับ ข้อมูลของคุณ
สร้างอินสแตนซ์ Realtime Database หลายรายการ
หากใช้แพ็กเกจราคา Blaze คุณจะสร้างอินสแตนซ์ฐานข้อมูลได้สูงสุด 1,000 รายการในโปรเจ็กต์ Firebase เดียวกัน
คอนโซล Firebase ที่มีเมนูตามบริบทในส่วนฐานข้อมูล" />
- ในFirebaseคอนโซล ให้ไปที่แท็บข้อมูลในส่วน พัฒนา > ฐานข้อมูล
- เลือกสร้างฐานข้อมูลใหม่จากเมนูในส่วน Realtime Database
- ปรับแต่งการอ้างอิงฐานข้อมูลและกฎความปลอดภัย แล้วคลิกรับทราบ
ทำกระบวนการนี้ซ้ำเพื่อสร้างอินสแตนซ์ฐานข้อมูลได้มากเท่าที่ต้องการ อินสแตนซ์ฐานข้อมูลแต่ละรายการมีชุดFirebase Realtime Database Security Rulesของตัวเอง คุณจึงปรับแต่งสิทธิ์เข้าถึงข้อมูลได้
คุณสร้างและจัดการอินสแตนซ์ฐานข้อมูลได้ในFirebaseคอนโซลหรือโดยใช้ Realtime Database Management REST API
แก้ไขและติดตั้งใช้งาน Realtime Database Security Rules สำหรับแต่ละอินสแตนซ์
ตรวจสอบว่า Realtime Database Security Rules อนุญาตให้เข้าถึงอินสแตนซ์ฐานข้อมูลแต่ละรายการในโปรเจ็กต์ได้อย่างเหมาะสม ฐานข้อมูลแต่ละรายการจะมีชุดกฎของตัวเอง ซึ่งคุณแก้ไขและติดตั้งใช้งานได้จากFirebase คอนโซล หรือใช้ Firebase CLI เพื่อติดตั้งใช้งานเป้าหมาย
หากต้องการแก้ไขและใช้กฎจากคอนโซล Firebase ให้ทำตามขั้นตอนต่อไปนี้
- ไปที่แท็บกฎ ในส่วนพัฒนา > ฐานข้อมูล
- เลือกฐานข้อมูลที่ต้องการแก้ไข แล้วแก้ไขกฎ
หากต้องการแก้ไขและใช้กฎจาก 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 CLI
ใช้--instance
ตัวเลือกเพื่อระบุFirebase Realtime Databaseที่ต้องการ
ใช้คำสั่ง Firebase CLI เช่น ใช้คำสั่งต่อไปนี้เพื่อเรียกใช้
โปรไฟล์เลอร์สำหรับอินสแตนซ์ฐานข้อมูลชื่อ my-example-shard.firebaseio.com
firebase database:profile --instance "my-example-shard"
เพิ่มประสิทธิภาพการเชื่อมต่อในแต่ละฐานข้อมูล
หากไคลเอ็นต์แต่ละรายต้องเชื่อมต่อกับฐานข้อมูลหลายรายการในระหว่างเซสชัน คุณจะลดจำนวนการเชื่อมต่อพร้อมกันกับอินสแตนซ์ฐานข้อมูลแต่ละรายการได้โดยเชื่อมต่อกับอินสแตนซ์ฐานข้อมูลแต่ละรายการเฉพาะเมื่อจำเป็นเท่านั้น
รับคำแนะนำเพิ่มเติม
หากต้องการความช่วยเหลือเพิ่มเติมในการแบ่งข้อมูลในอินสแตนซ์ฐานข้อมูลหลายรายการ โปรดติดต่อผู้เชี่ยวชาญของ Firebase ในช่อง Slack หรือใน Stack Overflow