วิธีที่ดีที่สุดในการเพิ่มประสิทธิภาพและปรับขนาดข้อมูลในฐานข้อมูลเรียลไทม์ของ Firebase คือการแยกข้อมูลของคุณในอินสแตนซ์ Realtime Database หลายรายการหรือที่เรียกว่า ชาร์ดดิ้งฐานข้อมูล ชาร์ดดิ้งให้คุณมีความยืดหยุ่นในการปรับขนาด ขีดจำกัดที่ใช้กับฐานข้อมูลแต่ละรายการ อินสแตนซ์ นอกเหนือไปจากการจัดสรรภาระงานและการเพิ่มประสิทธิภาพ
ควรชาร์ดข้อมูลเมื่อใด
คุณอาจต้องการชาร์ดข้อมูลของคุณข้ามฐานข้อมูลหลายฐานข้อมูลหากคุณใช้ Realtime Database และใช้ได้กับสถานการณ์ต่อไปนี้
- คุณต้องการปรับขนาดให้เกินขีดจำกัด 200,000 การเชื่อมต่อพร้อมกัน การเขียน 1,000 รายการ/วินาที หรือแบบอื่นๆ ขีดจำกัดสำหรับอินสแตนซ์ฐานข้อมูลเดียว
- คุณมีชุดข้อมูลหลายชุดที่แยกจากกันและต้องการเพิ่มประสิทธิภาพ (เช่น แอปแชทที่ให้บริการกลุ่มผู้ใช้แยกเป็นอิสระ)
- คุณต้องการปรับภาระงานของฐานข้อมูลต่างๆ ให้สมดุลเพื่อปรับปรุงระยะเวลาทำงานและ ลดความเสี่ยงของภาระงานที่อินสแตนซ์ฐานข้อมูลเดียวมากเกินไป
วิธีชาร์ดข้อมูล
ในการชาร์ดข้อมูลของคุณ ให้ทำตามขั้นตอนเหล่านี้ (อธิบายอย่างละเอียดด้านล่าง)
- แมปข้อมูลของคุณกับฐานข้อมูลหลายแห่งตามความต้องการเฉพาะของแอป
- สร้างอินสแตนซ์ฐานข้อมูลหลายรายการ
- กำหนดค่าแอปเพื่อให้เชื่อมต่อกับอินสแตนซ์ Realtime Database ที่จำเป็น สำหรับชุดข้อมูลแต่ละชุด
แมปข้อมูลของคุณ
เมื่อคุณจับคู่ข้อมูลกับฐานข้อมูลหลายแห่ง ให้พยายาม เงื่อนไขต่อไปนี้
- การค้นหาแต่ละรายการจะทำงานกับอินสแตนซ์ฐานข้อมูลเดียวเท่านั้น Realtime Database ไม่รองรับการค้นหาในอินสแตนซ์ฐานข้อมูลต่างๆ
- ไม่มีการแชร์หรือการทำซ้ำข้อมูลในอินสแตนซ์ฐานข้อมูล (หรือการแชร์หรือการทำซ้ำให้น้อยที่สุด)
- อินสแตนซ์ของแอปแต่ละรายการจะเชื่อมต่อกับฐานข้อมูลเพียง 1 รายการในช่วงเวลาหนึ่งเท่านั้น
ลองพิจารณาใช้กลยุทธ์ต่อไปนี้เมื่อแมปข้อมูล
สร้าง "Master Shard"
จัดเก็บแผนที่ของวิธีการจัดเก็บข้อมูลของคุณ อินสแตนซ์ฐานข้อมูล ด้วยวิธีนี้ คุณสามารถค้นหาฐานข้อมูล อินสแตนซ์จะสอดคล้องกับไคลเอ็นต์ที่เชื่อมต่อ โปรดทราบว่า มีค่าใช้จ่ายมากกว่าการเชื่อมต่อไปยังฐานข้อมูลใดฐานข้อมูลหนึ่งโดยตรง ในเวลาที่ต้องการได้ทันที
ที่เก็บข้อมูลตามหมวดหมู่หรือตามลูกค้า
จัดเก็บข้อมูลในอินสแตนซ์ฐานข้อมูลที่แยกส่วนอยู่ โดยจัดกลุ่มตามผู้ใช้หรือประเภทข้อมูล เช่น หากคุณสร้างแอปพลิเคชันแชทที่ให้บริการหลายองค์กร คุณสามารถสร้างอินสแตนซ์ฐานข้อมูลสำหรับแต่ละองค์กรและจัดเก็บแชททั้งหมด ข้อมูลในอินสแตนซ์ฐานข้อมูลที่ไม่ซ้ำกัน
ในกรณีนี้ องค์กร A และองค์กร B ไม่ได้แชร์ข้อมูลกัน จึงไม่มีการแชร์ ข้อมูลที่ซ้ำกันใดๆ ในฐานข้อมูลของคุณ และเพียงใช้การค้นหา อินสแตนซ์ฐานข้อมูลเดียว นอกจากนี้ เฉพาะผู้ใช้ในแต่ละองค์กร เชื่อมต่อกับฐานข้อมูลขององค์กรได้เมื่อใช้แอปแชท
จากนั้นคุณสามารถสร้างอินสแตนซ์ฐานข้อมูลหลายรายการล่วงหน้าและใช้ รหัสขององค์กรเพื่อแมปทีมกับอินสแตนซ์ฐานข้อมูล ตัวอย่างเช่น องค์กร A จะแมปกับ Realtime Database A
วิธีที่คุณแมปข้อมูลสำหรับแอปจะขึ้นอยู่กับกรณีการใช้งานของคุณ เงื่อนไขและกลยุทธ์ที่ระบุไว้ข้างต้นจะช่วยให้คุณกำหนดได้ว่าสิ่งใดใช้ได้ผลกับ
สร้างอินสแตนซ์ Realtime Database หลายรายการ
ถ้าใช้แพ็กเกจราคา Blaze คุณจะสร้างได้สูงสุด 1,000 อินสแตนซ์ฐานข้อมูลในโปรเจ็กต์ Firebase เดียวกัน
- ในคอนโซล Firebase ให้ไปที่แท็บข้อมูลใน พัฒนา > ฐานข้อมูล
- เลือกสร้างฐานข้อมูลใหม่จากเมนูในส่วนฐานข้อมูลเรียลไทม์
- ปรับแต่งข้อมูลอ้างอิงฐานข้อมูลและ กฎความปลอดภัย จากนั้นคลิกรับทราบ
ทำขั้นตอนนี้ซ้ำเพื่อสร้างอินสแตนซ์ฐานข้อมูลได้มากเท่าที่ต้องการ ชิ้น อินสแตนซ์ฐานข้อมูลมีชุดกฎการรักษาความปลอดภัยของฐานข้อมูลเรียลไทม์ของ Firebase อยู่แล้ว คุณจึงดำเนินการต่อไปนี้ได้ ปรับแต่งการเข้าถึงข้อมูล
คุณสามารถสร้างและจัดการอินสแตนซ์ฐานข้อมูลได้ในคอนโซล Firebase หรือใช้ Realtime Database Management REST API
แก้ไขและทำให้กฎการรักษาความปลอดภัยของฐานข้อมูลเรียลไทม์ใช้งานได้สำหรับแต่ละอินสแตนซ์
ตรวจสอบว่ากฎความปลอดภัยของ Realtime Database อนุญาตการเข้าถึงที่เหมาะสม อินสแตนซ์ฐานข้อมูลในโปรเจ็กต์ของคุณ ฐานข้อมูลแต่ละรายการจะมีชุดกฎของตัวเอง ซึ่งคุณสามารถแก้ไขและทำให้ใช้งานได้จากคอนโซล Firebase หรือใช้ Firebase CLI สำหรับทำให้เป้าหมายใช้งานได้
หากต้องการแก้ไขและทำให้กฎใช้งานได้จากคอนโซล Firebase ให้ทำตามขั้นตอนต่อไปนี้
- ไปที่หน้า แท็บกฎ ใน Develop > ฐานข้อมูล
- เลือกฐานข้อมูลที่ต้องการแก้ไข แล้วแก้ไขกฎ
หากต้องการแก้ไขและทำให้กฎจาก 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 (รัดกุม ไม่ใช่อะตอม) 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