ปรับขนาดโดยใช้ฐานข้อมูลที่หลากหลาย

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

กรณีที่ควรชาร์ดข้อมูล

คุณอาจต้องชาร์ดข้อมูลในฐานข้อมูลหลายรายการหากใช้ Realtime Database และเข้าข่ายสถานการณ์ต่อไปนี้

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

วิธีชาร์ดข้อมูล

หากต้องการชาร์ดข้อมูล ให้ทำตามขั้นตอนต่อไปนี้ (อธิบายโดยละเอียดด้านล่าง)

  1. แมปข้อมูลกับฐานข้อมูลหลายรายการตามความต้องการเฉพาะของแอป
  2. สร้างอินสแตนซ์ฐานข้อมูลหลายรายการ
  3. กำหนดค่าแอปให้เชื่อมต่อกับอินสแตนซ์ Realtime Database ที่จำเป็นสำหรับชุดข้อมูลแต่ละชุด

แมปข้อมูล

เมื่อแมปข้อมูลกับฐานข้อมูลหลายรายการ ให้พยายามปฏิบัติตามเงื่อนไขต่อไปนี้

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

ขณะแมปข้อมูล ให้พิจารณาใช้กลยุทธ์ต่อไปนี้

สร้าง "ชาร์ดหลัก"

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

จัดกลุ่มข้อมูลตามหมวดหมู่หรือตามลูกค้า

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

ในกรณีนี้ องค์กร A และองค์กร B ไม่ได้แชร์ข้อมูลกัน ไม่มีข้อมูลที่ซ้ำกันในฐานข้อมูล และคุณจะค้นหาข้อมูลจากอินสแตนซ์ฐานข้อมูลเดียวเท่านั้น นอกจากนี้ ผู้ใช้ในแต่ละองค์กรจะเชื่อมต่อกับฐานข้อมูลขององค์กรตนเองเท่านั้นเมื่อใช้แอปแชท

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

วิธีแมปข้อมูลสำหรับแอปขึ้นอยู่กับ Use Case ของคุณ แต่เงื่อนไขและกลยุทธ์ที่ระบุไว้ข้างต้นจะช่วยคุณกำหนดสิ่งที่เหมาะกับข้อมูลของคุณได้

สร้างอินสแตนซ์ Realtime Database หลายรายการ

หากใช้แพ็กเกจราคา Blaze คุณจะสร้างอินสแตนซ์ฐานข้อมูลได้สูงสุด 1,000 รายการในโปรเจ็กต์ Firebase เดียวกัน

สร้างฐานข้อมูลในคอนโซล Firebase โดยใช้เมนูตามบริบทในส่วนฐานข้อมูล

  1. ในคอนโซล Firebase ให้ไปที่ฐานข้อมูลและพื้นที่เก็บข้อมูล > Realtime Database > แท็บข้อมูล

  2. เลือกสร้างฐานข้อมูลใหม่จากเมนูแบบเลื่อนลง

  3. ปรับแต่งการอ้างอิงฐานข้อมูล Security Rules แล้วคลิกรับทราบ

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

คุณสามารถสร้างและจัดการอินสแตนซ์ฐานข้อมูลในคอนโซล Firebase หรือใช้ REST API สำหรับการจัดการ Realtime Database

จัดการและโต้ตอบกับอินสแตนซ์ที่เฉพาะเจาะจงโดยใช้ CLI

คุณสามารถจัดการและโต้ตอบกับอินสแตนซ์ Realtime Database ที่เฉพาะเจาะจงได้โดยใช้ CLI ของ Firebase

โดยค่าเริ่มต้น คำสั่ง CLI จะโต้ตอบกับอินสแตนซ์ฐานข้อมูลเริ่มต้น อย่างไรก็ตาม คุณสามารถโต้ตอบกับอินสแตนซ์ฐานข้อมูลที่ไม่ใช่ค่าเริ่มต้นได้โดยใช้แฟล็ก --instance DATABASE_NAME

เช่น ใช้คำสั่งต่อไปนี้เพื่อเรียกใช้เครื่องมือวิเคราะห์สำหรับอินสแตนซ์ฐานข้อมูลชื่อ my-example-shard.firebaseio.com

firebase database:profile --instance "my-example-shard"

คำสั่งต่อไปนี้รองรับแฟล็ก --instance

  • firebase database:get
  • firebase database:profile
  • firebase database:push
  • firebase database:remove
  • firebase database:set
  • firebase database:update

แก้ไขและติดตั้งใช้งาน Realtime Database Security Rules สำหรับแต่ละอินสแตนซ์

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

  • หากต้องการแก้ไขและติดตั้งใช้งานกฎจากคอนโซล Firebase ให้ทำตามขั้นตอนต่อไปนี้

    1. ในคอนโซล Firebase ให้ไปที่ฐานข้อมูลและพื้นที่เก็บข้อมูล > Realtime Database > แท็บกฎ

    2. เลือกฐานข้อมูลที่ต้องการแก้ไข แล้วแก้ไขกฎ

  • หากต้องการแก้ไขและติดตั้งใช้งานกฎจาก Firebase CLI ให้ทำตามขั้นตอนต่อไปนี้

    1. แก้ไขกฎในไฟล์กฎสำหรับอินสแตนซ์ฐานข้อมูล (เช่น foo.rules.json)

    2. สร้างและใช้เป้าหมายการทำให้ใช้งานได้เพื่อเชื่อมโยงฐานข้อมูลที่ใช้ไฟล์กฎเดียวกัน เช่น

      firebase target:apply database main my-db-1 my-db-2
      firebase target:apply database other my-other-db-3

    3. อัปเดตไฟล์การกำหนดค่า firebase.json ด้วยเป้าหมายการทำให้ใช้งานได้ ดังนี้

      {
        "database": [
          {"target": "main", "rules": "foo.rules.json"},
          {"target": "other", "rules": "bar.rules.json"}
        ]
      }
      
    4. เรียกใช้คำสั่ง deploy ดังนี้

      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
หมายเหตุ: ผลิตภัณฑ์ Firebase นี้ไม่พร้อมใช้งานในเป้าหมาย App Clip
// Get the default database instance for an app
var ref: DatabaseReference!

ref = Database.database().reference()
// รับอินสแตนซ์ฐานข้อมูลรองตาม URL var ref: DatabaseReference! ref = Database.database("https://testapp-1234.firebaseio.com").reference()
Objective-C
หมายเหตุ: ผลิตภัณฑ์ Firebase นี้ไม่พร้อมใช้งานในเป้าหมาย App Clip
// Get the default database instance for an app
@property (strong, nonatomic) FIRDatabaseReference *ref;

self.ref = [[FIRDatabase database] reference];
// Get a secondary database instance by URL @property (strong, nonatomic) FIRDatabaseReference *ref; self.ref = [[FIRDatabase databaseWithURL:@"https://testapp-1234.firebaseio.com"] 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