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

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

กรณีที่ควรแบ่งส่วนข้อมูล

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

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

วิธีแบ่งส่วนข้อมูล

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

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

แมปข้อมูล

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

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

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

สร้าง "ส่วนหลัก"

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

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

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

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

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

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

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

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

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

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

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

  3. ปรับแต่งข้อมูลอ้างอิงฐานข้อมูล และ 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: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 หรือใช้ CLI Firebase เพื่อติดตั้งใช้งานเป้าหมาย

  • หากต้องการแก้ไขและติดตั้งใช้งานกฎจากคอนโซล 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. เรียกใช้คําสั่งติดตั้งใช้งาน

      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()
// Get a secondary database instance by 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