Najlepszym sposobem na optymalizację wydajności i skalowanie danych w Firebase Realtime Database jest podzielenie danych na kilka instancji Realtime Database, czyli tzw. fragmentowanie bazy danych. Fragmentowanie umożliwia skalowanie poza limity obowiązujące w przypadku pojedynczych instancji bazy danych, a także równoważenie obciążenia i optymalizację wydajności.
Kiedy fragmentować dane
Fragmentowanie danych na kilka baz danych może być przydatne, jeśli korzystasz z Realtime Database i spełniasz któryś z tych warunków:
- Chcesz skalować poza limit 200 tys. jednoczesnych połączeń, 1 tys. operacji zapisu na sekundę lub inne limity dotyczące pojedynczej instancji bazy danych.
- Masz kilka oddzielnych zbiorów danych i chcesz zoptymalizować wydajność (np. w przypadku aplikacji do czatu, która obsługuje oddzielne, niezależne grupy użytkowników).
- Chcesz zrównoważyć obciążenie między kilkoma bazami danych, aby zwiększyć czas działania i zmniejszyć ryzyko przeciążenia pojedynczej instancji bazy danych.
Jak fragmentować dane
Aby fragmentować dane, wykonaj te czynności (opisane bardziej szczegółowo poniżej):
- Zmapuj dane na kilka baz danych zgodnie z konkretnymi potrzebami aplikacji.
- Utwórz kilka instancji bazy danych.
- Skonfiguruj aplikację tak, aby łączyła się z instancją Realtime Database niezbędną dla każdego zbioru danych.
Mapowanie danych
Podczas mapowania danych na kilka baz danych staraj się spełnić te warunki:
- Każde zapytanie jest wykonywane tylko w jednej instancji bazy danych. Realtime Database nie obsługuje zapytań w wielu instancjach bazy danych.
- Brak udostępniania lub duplikowania danych w instancjach bazy danych (albo minimalne udostępnianie lub duplikowanie).
- Każda instancja aplikacji w danym momencie łączy się tylko z jedną bazą danych.
Podczas mapowania danych rozważ zastosowanie tych strategii:
Utwórz „fragment główny”
Przechowuj mapę sposobu przechowywania danych w instancjach bazy danych. Dzięki temu możesz programowo wyszukiwać, która instancja bazy danych odpowiada łączącemu się klientowi. Pamiętaj, że może to wiązać się z większym obciążeniem niż bezpośrednie łączenie się z konkretną instancją bazy danych, gdy jest to potrzebne.
Grupowanie danych według kategorii lub klientów
Przechowuj dane w odizolowanych instancjach bazy danych pogrupowanych według użytkownika lub typu danych. Jeśli na przykład tworzysz aplikację do czatu, która obsługuje wiele organizacji, możesz utworzyć instancję bazy danych dla każdej organizacji i przechowywać wszystkie dane czatu w unikalnych instancjach bazy danych.
W takim przypadku organizacja A i organizacja B nie udostępniają sobie danych, w bazach danych nie ma zduplikowanych danych, a zapytania są wykonywane tylko w jednej instancji bazy danych. Dodatkowo użytkownicy w każdej organizacji łączą się z bazą danych swojej organizacji tylko wtedy, gdy korzystają z aplikacji do czatu.
Możesz z wyprzedzeniem utworzyć kilka instancji bazy danych i użyć identyfikatora organizacji, aby przypisać zespół do jego instancji bazy danych. Na przykład organizacja A jest przypisana do Bazy danych czasu rzeczywistego A.
Sposób mapowania danych w aplikacji zależy od konkretnego przypadku użycia, ale opisane powyżej warunki i strategie mogą pomóc Ci określić, co będzie najlepsze dla Twoich danych.
Tworzenie wielu instancji Realtime Database
Jeśli korzystasz z abonamentu Blaze, możesz utworzyć do 1000 instancji bazy danych w tym samym projekcie w Firebase.

W konsoli Firebase otwórz kartę Bazy danych i pamięć masowa > Baza danych czasu rzeczywistego > Dane.
W menu wybierz Utwórz nową bazę danych.
Dostosuj odniesienie do bazy danych i Security Rules, a następnie kliknij OK.
Powtórz ten proces, aby utworzyć tyle instancji bazy danych, ile potrzebujesz. Każda instancja bazy danych ma własny zestaw Firebase Realtime Database Security Rules, dzięki czemu możesz precyzyjnie dostosować dostęp do swoich danych.
Instancje bazy danych możesz tworzyć i nimi zarządzać w konsoli Firebase lub za pomocą interfejsu Realtime Database Management REST API.
Zarządzanie konkretnymi instancjami za pomocą interfejsu wiersza poleceń i interakcja z nimi
Za pomocą interfejsu wiersza poleceń Firebase możesz zarządzać konkretnymi instancjami Realtime Database i wchodzić z nimi w interakcję.
Domyślnie polecenia interfejsu wiersza poleceń wchodzą w interakcję z domyślną instancją bazy danych. Możesz jednak wchodzić w interakcję z inną niż domyślna instancją bazy danych, używając flagi
--instance DATABASE_NAME
Aby na przykład uruchomić profiler dla instancji bazy danych o nazwie my-example-shard.firebaseio.com, użyj tego polecenia:
firebase database:profile --instance "my-example-shard"
Te polecenia obsługują flagę --instance:
firebase database:getfirebase database:profilefirebase database:pushfirebase database:removefirebase database:setfirebase database:update
Edytowanie i wdrażanie Realtime Database Security Rules dla każdej instancji
Upewnij się, że Realtime Database Security Rules umożliwiają odpowiedni dostęp do każdej instancji bazy danych w projekcie. Każda baza danych ma własny zestaw reguł, które możesz edytować i wdrażać w konsoli Firebase lub za pomocą Firebase interfejsu wiersza poleceń, aby wdrożyć elementy docelowe.
Aby edytować i wdrażać reguły w konsoli Firebase:
W konsoli Firebase otwórz kartę Bazy danych i pamięć masowa > Baza danych czasu rzeczywistego > Reguły.
Wybierz bazę danych, którą chcesz edytować, a następnie zmodyfikuj reguły.
Aby edytować i wdrażać reguły za pomocą interfejsu wiersza poleceń Firebase:
Zmodyfikuj reguły w plikach reguł dla instancji bazy danych (np.
foo.rules.json).Utwórz i zastosuj cele wdrożenia, aby powiązać bazy danych, które używają tego samego pliku reguł. Przykład:
firebase target:apply database main my-db-1 my-db-2
firebase target:apply database other my-other-db-3
Zaktualizuj plik konfiguracji
firebase.jsono cele wdrożenia:{ "database": [ {"target": "main", "rules": "foo.rules.json"}, {"target": "other", "rules": "bar.rules.json"} ] }Uruchom polecenie wdrożenia:
firebase deploy
Pamiętaj, aby edytować i wdrażać reguły zawsze w tym samym miejscu. Wdrożenie reguł za pomocą interfejsu wiersza poleceń Firebase spowoduje zastąpienie wszelkich zmian wprowadzonych w konsoli Firebase, a edytowanie reguł bezpośrednio w konsoli Firebase spowoduje zastąpienie wszelkich ostatnich zmian wdrożonych za pomocą interfejsu wiersza poleceń Firebase.
Łączenie aplikacji z wieloma instancjami bazy danych
Aby uzyskać dostęp do danych przechowywanych w dodatkowych instancjach bazy danych, użyj odniesienia do bazy danych. Odniesienie do konkretnej instancji bazy danych możesz uzyskać za pomocą adresu URL lub aplikacji. Jeśli nie podasz adresu URL, otrzymasz odniesienie do domyślnej instancji bazy danych aplikacji.
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()
Objective-C
// Get the default database instance for an app@property (strong, nonatomic) FIRDatabaseReference *ref; self.ref = [[FIRDatabase database] 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();
Optymalizacja połączeń w każdej bazie danych
Jeśli każdy klient musi połączyć się z kilkoma bazami danych podczas sesji, możesz zmniejszyć liczbę jednoczesnych połączeń z każdą instancją bazy danych, łącząc się z każdą instancją bazy danych tylko na czas niezbędny do wykonania zadania.
Uzyskiwanie dodatkowych porad
Jeśli potrzebujesz dodatkowej pomocy w zakresie fragmentowania danych na kilka instancji bazy danych, skontaktuj się z ekspertami Firebase na naszym kanale na Slacku lub na Stack Overflow.