วิธีที่ดีที่สุดในการเพิ่มประสิทธิภาพและปรับขนาดข้อมูลในฐานข้อมูลเรียลไทม์ของ Firebase คือแบ่งข้อมูลของคุณเป็นอินสแตนซ์ Realtime Database หลายรายการหรือที่เรียกว่าการชาร์ดดิ้งฐานข้อมูล การชาร์ดมอบความยืดหยุ่นในการปรับขนาดนอกเหนือจากขีดจำกัดที่มีผลกับอินสแตนซ์ฐานข้อมูลแต่ละรายการ นอกเหนือจากการจัดสรรภาระงานและการเพิ่มประสิทธิภาพ
ควรชาร์ดข้อมูลเมื่อใด
คุณอาจต้องชาร์ดข้อมูลในหลายฐานข้อมูลหากคุณใช้ Realtime Database และตรงกับสถานการณ์ใดสถานการณ์หนึ่งต่อไปนี้
- คุณต้องการปรับขนาดให้เกินขีดจำกัดการเชื่อมต่อพร้อมกัน 200,000 รายการ การดำเนินการเขียน 1,000 รายการ/วินาที หรือขีดจำกัดอื่นๆ สำหรับอินสแตนซ์ฐานข้อมูลเดียว
- คุณมีชุดข้อมูลที่แยกกันหลายชุดและต้องการเพิ่มประสิทธิภาพ (เช่น แอปแชทที่ให้บริการกลุ่มผู้ใช้ที่แยกจากกันและเป็นอิสระ)
- คุณต้องการสร้างสมดุลระหว่างภาระงานในฐานข้อมูลหลายรายการเพื่อปรับปรุงระยะเวลาทำงานและลดความเสี่ยงที่จะทำให้อินสแตนซ์ฐานข้อมูลเดียวทำงานหนักเกินไป
วิธีชาร์ดข้อมูล
ในการชาร์ดข้อมูล ให้ทำตามขั้นตอนต่อไปนี้ (อธิบายอย่างละเอียดด้านล่าง)
- แมปข้อมูลของคุณกับฐานข้อมูลหลายแห่งตามความต้องการเฉพาะของแอป
- สร้างอินสแตนซ์ฐานข้อมูลหลายรายการ
- กำหนดค่าแอปให้เชื่อมต่อกับอินสแตนซ์ Realtime Database ที่จำเป็นสำหรับชุดข้อมูลแต่ละชุด
แมปข้อมูลของคุณ
เมื่อคุณแมปข้อมูลกับฐานข้อมูลหลายแห่ง ให้ลองปฏิบัติตามเงื่อนไขต่อไปนี้
- การค้นหาแต่ละรายการจะทำงานกับอินสแตนซ์ฐานข้อมูลเดียวเท่านั้น Realtime Database ไม่รองรับการค้นหาในอินสแตนซ์ฐานข้อมูล
- ไม่มีการแชร์หรือทำซ้ำข้อมูลในอินสแตนซ์ฐานข้อมูล (หรือแชร์หรือทำซ้ำให้น้อยที่สุด)
- อินสแตนซ์ของแอปแต่ละรายการจะเชื่อมต่อกับฐานข้อมูลเพียง 1 รายการในช่วงเวลาหนึ่งๆ
ในขณะที่คุณกำลังแมปข้อมูล ให้พิจารณาใช้กลยุทธ์ต่อไปนี้
สร้าง "ชาร์ดหลัก"
จัดเก็บแผนที่ของวิธีการจัดเก็บข้อมูลของคุณในอินสแตนซ์ฐานข้อมูล วิธีนี้จะช่วยให้คุณค้นหาอินสแตนซ์ฐานข้อมูลที่ตรงกับไคลเอ็นต์ที่เชื่อมต่อได้ด้วยการเขียนโปรแกรม โปรดทราบว่าการดำเนินการนี้อาจมีค่าใช้จ่ายมากกว่าการเชื่อมต่อเข้ากับอินสแตนซ์ฐานข้อมูลที่คุณต้องการโดยตรงเมื่อต้องการ
ที่เก็บข้อมูลตามหมวดหมู่หรือตามลูกค้า
จัดเก็บข้อมูลในอินสแตนซ์ฐานข้อมูลแบบแยกส่วน โดยจัดกลุ่มตามผู้ใช้หรือประเภทข้อมูล ตัวอย่างเช่น หากคุณสร้างแอปพลิเคชันแชทที่ให้บริการหลายองค์กร คุณจะสร้างอินสแตนซ์ฐานข้อมูลสำหรับแต่ละองค์กรและจัดเก็บข้อมูลแชททั้งหมดในอินสแตนซ์ฐานข้อมูลที่ไม่ซ้ำกันได้
ในกรณีนี้ องค์กร A และองค์กร B จะไม่แชร์ข้อมูล ไม่มีข้อมูลที่ซ้ำกันในฐานข้อมูล และคุณจะดำเนินการค้นหากับอินสแตนซ์ฐานข้อมูลเดียวเท่านั้น นอกจากนี้ ผู้ใช้ในแต่ละองค์กร จะเชื่อมต่อกับฐานข้อมูลขององค์กรได้เมื่อใช้แอปแชทเท่านั้น
จากนั้นคุณจะสร้างอินสแตนซ์ฐานข้อมูลหลายรายการล่วงหน้าและใช้รหัสขององค์กรเพื่อแมปทีมกับอินสแตนซ์ฐานข้อมูลได้ ตัวอย่างเช่น องค์กร ก จะแมปกับ Realtime Database A
วิธีการแมปข้อมูลสำหรับแอปขึ้นอยู่กับกรณีการใช้งานเฉพาะของคุณ แต่เงื่อนไขและกลยุทธ์ที่ระบุไว้ข้างต้นสามารถช่วยคุณกำหนดได้ว่าอะไรเหมาะกับข้อมูลของคุณ
สร้างอินสแตนซ์ Realtime Database หลายรายการ
หากใช้แผนการตั้งราคา Blaze คุณจะสร้างอินสแตนซ์ฐานข้อมูลได้สูงสุด 1,000 รายการในโปรเจ็กต์ Firebase เดียวกัน
- ในคอนโซล Firebase ไปที่แท็บข้อมูลในส่วนพัฒนา > ฐานข้อมูล
- เลือกสร้างฐานข้อมูลใหม่จากเมนูในส่วน Realtime Database
- ปรับแต่งการอ้างอิงฐานข้อมูลและกฎความปลอดภัย แล้วคลิกรับทราบ
ทำขั้นตอนนี้ซ้ำเพื่อสร้างอินสแตนซ์ฐานข้อมูลได้มากเท่าที่ต้องการ อินสแตนซ์ฐานข้อมูลแต่ละอินสแตนซ์มีชุดกฎความปลอดภัยของฐานข้อมูลเรียลไทม์ของ Firebase เป็นของตัวเองเพื่อให้คุณปรับแต่งการเข้าถึงข้อมูลได้
คุณสร้างและจัดการอินสแตนซ์ฐานข้อมูลได้ในคอนโซล Firebase หรือใช้ REST API ของการจัดการฐานข้อมูลเรียลไทม์
แก้ไขและทำให้กฎความปลอดภัยของฐานข้อมูลเรียลไทม์ใช้งานได้สำหรับอินสแตนซ์แต่ละรายการ
ตรวจสอบว่ากฎความปลอดภัยของ Realtime Database อนุญาตการเข้าถึงที่เหมาะสมแก่อินสแตนซ์ฐานข้อมูลแต่ละรายการในโปรเจ็กต์ ฐานข้อมูลแต่ละรายการจะมีชุดกฎของตัวเอง ซึ่งคุณแก้ไขและทำให้ใช้งานได้จากคอนโซล 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()// รับอินสแตนซ์ฐานข้อมูลรองจาก URL var ref: DatabaseReference! ref = Database.database("https://testapp-1234.firebaseio.com")reference()
Objective-C
// Get the default database instance for an app@property (strong, nonatomic) FIRDatabaseReference *ref; self.ref = [[FIRDatabase database] reference];// รับอินสแตนซ์ฐานข้อมูลรองโดยใช้ URL @property (strong, nonatomic) FIRDatabaseReference *ref; self.ref = [[FIRDatabase DatabaseWithURL:@"https://testapp-1234.firebaseio.com"] reference]
Kotlin+KTX
// 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 ที่ต้องการใช้คำสั่ง Firebase CLI ตัวอย่างเช่น ใช้คำสั่งต่อไปนี้เพื่อเรียกใช้เครื่องมือสร้างโปรไฟล์สำหรับอินสแตนซ์ฐานข้อมูลชื่อ my-example-shard.firebaseio.com
firebase database:profile --instance "my-example-shard"
เพิ่มประสิทธิภาพการเชื่อมต่อในฐานข้อมูลแต่ละรายการ
หากไคลเอ็นต์แต่ละรายต้องการเชื่อมต่อกับหลายฐานข้อมูลในระหว่างเซสชัน คุณสามารถลดจำนวนการเชื่อมต่อพร้อมกันไปยังอินสแตนซ์ฐานข้อมูลแต่ละรายการโดยเชื่อมต่อกับอินสแตนซ์ฐานข้อมูลแต่ละรายการได้นานเท่าที่จำเป็น
รับคำแนะนำเพิ่มเติม
หากต้องการความช่วยเหลือเพิ่มเติมในชาร์ดดิ้งข้อมูลข้ามอินสแตนซ์ฐานข้อมูลหลายรายการ โปรดติดต่อผู้เชี่ยวชาญของ Firebase ในช่องทาง Slack หรือทาง Stack Overflow