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

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

ควรชาร์ดข้อมูลเมื่อใด

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

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

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

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

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

แมปข้อมูล

เมื่อคุณจับคู่ข้อมูลกับฐานข้อมูลหลายแห่ง ให้พยายาม เงื่อนไขต่อไปนี้

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

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

สร้าง "Master Shard"

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

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

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

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

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

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

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

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

สร้างฐานข้อมูลใน <span class=คอนโซล Firebase ที่มีเมนูตามบริบทในส่วนฐานข้อมูล" />

  1. ในคอนโซล Firebase ให้ไปที่แท็บข้อมูลในส่วนพัฒนา > ฐานข้อมูล
  2. เลือกสร้างฐานข้อมูลใหม่จากเมนูในส่วนRealtime Database
  3. ปรับแต่งข้อมูลอ้างอิงฐานข้อมูลและ กฎความปลอดภัย จากนั้นคลิกรับทราบ

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

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

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

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

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

    1. ไปที่แท็บกฎในส่วนพัฒนา > ฐานข้อมูล
    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()
// รับอินสแตนซ์ฐานข้อมูลรองตาม 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];
// รับอินสแตนซ์ฐานข้อมูลที่ 2 ตาม 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 Realtime Database ที่ต้องการใช้คำสั่ง Firebase CLI เช่น ใช้คำสั่งต่อไปนี้เพื่อเรียกใช้ เครื่องมือสร้างโปรไฟล์สำหรับอินสแตนซ์ฐานข้อมูลชื่อ my-example-shard.firebaseio.com:

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

เพิ่มประสิทธิภาพการเชื่อมต่อในแต่ละฐานข้อมูล

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

รับคำแนะนำเพิ่มเติม

หากต้องการความช่วยเหลือเพิ่มเติมในการแยกข้อมูลของคุณไปยังอินสแตนซ์ฐานข้อมูลหลายรายการ โปรดติดต่อผู้เชี่ยวชาญ Firebase ในช่อง Slack หรือใน Stack Overflow