La meilleure façon d'optimiser les performances et de mettre à l'échelle vos données dans Firebase Realtime Database consiste à répartir vos données sur plusieurs instances Realtime Database, également appelées partitionnement de base de données. Le partitionnement vous offre la possibilité de dépasser les limites qui s'appliquent aux instances de base de données individuelles, en plus de l'équilibrage de charge et de l'optimisation des performances.
Quand partitionner vos données
Vous pouvez partitionner vos données sur plusieurs bases de données si vous utilisez Realtime Database et que vous vous trouvez dans l'un des cas suivants :
- Vous souhaitez dépasser la limite de 200 000 connexions simultanées, 1 000 opérations d'écriture par seconde ou toute autre limite pour une seule instance de base de données.
- Vous disposez de plusieurs ensembles de données distincts et vous souhaitez optimiser les performances (par exemple, une application de chat qui dessert des groupes d'utilisateurs distincts et indépendants).
- Vous souhaitez équilibrer la charge sur plusieurs bases de données pour améliorer la disponibilité et réduire le risque de surcharge d'une seule instance de base de données.
Comment partitionner vos données
Pour partitionner vos données, procédez comme suit (décrit plus en détail ci-dessous) :
- Mappez vos données sur plusieurs bases de données en fonction des besoins spécifiques de votre application.
- Créez plusieurs instances de base de données.
- Configurez votre application pour qu'elle se connecte à l'Realtime Database instance nécessaire pour chaque ensemble de données.
Mapper vos données
Lorsque vous mappez vos données sur plusieurs bases de données, essayez de respecter les conditions suivantes :
- Chaque requête ne s'exécute que sur une seule instance de base de données. Realtime Database n'est pas compatible avec les requêtes sur plusieurs instances de base de données.
- Aucun partage ni duplication de données entre les instances de base de données (ou partage ou duplication minimal).
- Chaque instance d'application ne se connecte qu'à une seule base de données à un moment donné.
Lorsque vous mappez vos données, envisagez d'appliquer les stratégies suivantes :
Créer un "shard maître"
Stockez une carte de la façon dont vos données sont stockées dans les instances de base de données. Vous pouvez ainsi rechercher par programmation l'instance de base de données qui correspond au client connecté. N'oubliez pas que cela peut entraîner une surcharge plus importante que la connexion directe à l'instance de base de données spécifique dont vous avez besoin, lorsque vous en avez besoin.
Regrouper les données par catégorie ou par client
Stockez les données dans des instances de base de données isolées, regroupées par utilisateur ou par type de données. Par exemple, si vous créez une application de chat qui dessert plusieurs organisations, vous pouvez créer une instance de base de données pour chaque organisation et stocker toutes les données de chat dans des instances de base de données uniques.
Dans ce cas, l'organisation A et l'organisation B ne partagent pas de données, il n'y a pas de données en double dans vos bases de données et vous n'effectuez des requêtes que sur une seule instance de base de données. De plus, les utilisateurs de chaque organisation ne se connectent à la base de données de leur organisation que lorsqu'ils utilisent l'application de chat.
Vous pouvez ensuite créer plusieurs instances de base de données à l'avance et utiliser l'ID de l'organisation pour mapper une équipe à son instance de base de données. Par exemple, l'organisation A est mappée à Realtime Database A.
La façon dont vous mappez les données de votre application dépend de votre cas d'utilisation particulier, mais les conditions et stratégies décrites ci-dessus peuvent vous aider à définir ce qui convient à vos données.
Créer plusieurs instancesRealtime Database
Si vous disposez de la formule de tarification Blaze, vous pouvez créer jusqu'à 1 000 instances de base de données dans le même projet Firebase.

Dans la console Firebase, accédez à l'onglet Bases de données et stockage > Realtime Database > Données.
Sélectionnez Créer une base de données dans le menu déroulant.
Personnalisez votre référence de base de données et Security Rules, puis cliquez sur OK.
Répétez le processus pour créer autant d'instances de base de données que nécessaire. Chaque instance de base de données possède son propre ensemble de Firebase Realtime Database Security Rules, ce qui vous permet d' affiner l'accès à vos données.
Vous pouvez créer et gérer des instances de base de données dans la console Firebase ou à l'aide de l'API REST de gestion de Realtime Database.
Gérer des instances spécifiques et interagir avec elles à l'aide de la CLI
Vous pouvez gérer des instances Realtime Database spécifiques et interagir avec elles à l'aide de la Firebase CLI.
Par défaut, les commandes de la CLI interagissent avec votre instance de base de données par défaut. Toutefois, vous pouvez interagir avec une instance de base de données non par défaut à l'aide de l'indicateur
--instance DATABASE_NAME
Par exemple, utilisez la commande suivante pour exécuter le profileur pour une instance de base de données nommée my-example-shard.firebaseio.com :
firebase database:profile --instance "my-example-shard"
Les commandes suivantes sont compatibles avec l'indicateur --instance :
firebase database:getfirebase database:profilefirebase database:pushfirebase database:removefirebase database:setfirebase database:update
Modifier et déployer Realtime Database Security Rules pour chaque instance
Assurez-vous que vos Realtime Database Security Rules autorisent l'accès approprié à chaque instance de base de données de votre projet. Chaque base de données possède son propre ensemble de règles, que vous pouvez modifier et déployer à partir de la Firebase console ou à l'aide de la Firebase CLI pour déployer des cibles.
Pour modifier et déployer des règles à partir de la console Firebase, procédez comme suit :
Dans la console Firebase, accédez à l'onglet Bases de données et stockage > Realtime Database > Règles.
Sélectionnez la base de données que vous souhaitez modifier, puis modifiez les règles.
Pour modifier et déployer des règles à partir de la Firebase CLI, procédez comme suit :
Modifiez les règles dans les fichiers de règles de vos instances de base de données (par exemple,
foo.rules.json).Créez et appliquez des cibles de déploiement pour associer des bases de données qui utilisent le même fichier de règles. Exemple :
firebase target:apply database main my-db-1 my-db-2
firebase target:apply database other my-other-db-3
Mettez à jour votre fichier de configuration
firebase.jsonavec les cibles de déploiement :{ "database": [ {"target": "main", "rules": "foo.rules.json"}, {"target": "other", "rules": "bar.rules.json"} ] }Exécutez la commande deploy :
firebase deploy
Assurez-vous de modifier et de déployer les règles de manière cohérente à partir du même emplacement. Le déploiement de règles à partir de la Firebase CLI remplace toutes les modifications que vous avez apportées dans la Firebase console, et la modification directe des règles dans la Firebase console remplace toutes les modifications récentes que vous avez déployées via la Firebase CLI.
Connecter votre application à plusieurs instances de base de données
Utilisez la référence de base de données pour accéder aux données stockées dans les instances de base de données secondaires. Vous pouvez obtenir la référence d'une instance de base de données spécifique par URL ou par application. Si vous ne spécifiez pas d'URL, vous obtiendrez la référence de l'instance de base de données par défaut de l'application.
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();
Optimiser les connexions sur chaque base de données
Si chaque client doit se connecter à plusieurs bases de données au cours d'une session, vous pouvez réduire le nombre de connexions simultanées à chaque instance de base de données en vous connectant à chaque instance de base de données uniquement pendant la durée nécessaire.
Obtenir d'autres conseils
Si vous avez besoin d'aide pour partitionner vos données sur plusieurs instances de base de données, contactez les experts Firebase sur notre chaîne Slack ou sur Stack Overflow.