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

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

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

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

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

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

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

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

แมปข้อมูล

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

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

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

สร้าง "กลุ่มหลัก"

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

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

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

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

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

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

สร้างอินสแตนซ์ 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