Dois-je utiliser une configuration de firebase database unique ou multiple pour une application multi-client?

Je travaille sur une application PHP qui vise à faciliter le workflow de l’entreprise et la gestion de projet, disons quelque chose comme Basecamp et GoPlan .

Je ne suis pas sûr de la meilleure approche, au niveau de la firebase database. Dois-je utiliser une firebase database unique et append des colonnes spécifiques à chaque client à chacune des tables ou devrais-je créer une firebase database pour chaque nouveau client? L’automatisation est un facteur important: je veux que ce soit simple de créer un nouveau client (et peut-être la possibilité de vous inscrire).

Contre possible je peux penser à utiliser une seule firebase database:

  • Manque d’extensibilité
  • Problèmes de sécurité (bien que les bogues ne soient pas là en premier lieu )

Que pensez-vous de ceci? Avez-vous des idées sur la solution que les entresockets ci-dessus sont les plus susceptibles d’avoir choisies?

En général, j’ajoute ClientID à toutes les tables et je vais avec une firebase database. Mais comme la firebase database est généralement difficile à faire évoluer, je pourrai également exécuter différentes instances de firebase database pour certains ou tous les clients.

De cette façon, vous pouvez avoir un groupe de petits clients dans une firebase database et les gros sur des serveurs distincts.

Un facteur clé pour la maintenabilité est que vous conservez le schéma identique dans toutes les bases de données. Il y aura suffisamment de soucis pour gérer le versionnage sans introduire de schémas spécifiques au client.

Écoutez le podcast Stackoverflow où Joel et Jeff parlent de la même question. Joel parle de leur expérience en proposant une version hébergée de leur logiciel. Il souligne que l’ajout d’identifiants client sur toute la firebase database complique la conception et le code (êtes-vous certain de ne pas avoir accidentellement ajouté une clause WHERE?) Et complique la fonctionnalité d’hébergement, comme les sauvegardes spécifiques au client.

C’était dans l’épisode 20 ou 21 (vérifiez les transcriptions pour plus de détails).

À mon avis, cela dépendra de votre clientèle probable. Si vous pouviez vous retrouver dans une situation où vos concurrents utilisent tous les deux votre système, vous auriez intérêt à utiliser des bases de données séparées. Cela dépend également de la manière dont plusieurs bases de données sont implémentées par votre SGBD. Si chaque firebase database possède une copie distincte de l’infrastructure, cela suggère une firebase database unique (ou une modification du SGBD). Si plusieurs bases de données peuvent être desservies par une seule copie de l’infrastructure, je choisirais des bases de données distinctes.

Pensez à la sauvegarde de firebase database. Le client A dit “Veuillez m’envoyer une copie de mes données”. Beaucoup, beaucoup plus facile dans une configuration de firebase database séparée que si une seule firebase database est partagée. Pensez à retirer un client; encore une fois, beaucoup plus facile avec des bases de données séparées.

(La partie «infrastructure» est très complexe car il existe des différences majeures entre différents SGBD sur ce qui constitue une «firebase database» et une «instance de serveur», par exemple. Ajouter : la question est marquée «mysql»; n’est pas complètement pertinent.)

Ajouter : un problème de plus: avec plusieurs clients dans une seule firebase database, chaque requête SQL doit garantir que les données du client correct sont choisies. Cela signifie que le SQL sera plus difficile à écrire et à lire, et que le SGBD devra travailler plus dur sur le traitement des données, et que les index seront plus gros et … client à plusieurs fins.

Clairement, StackOverflow (par exemple) ne possède pas de firebase database distincte par utilisateur. nous utilisons tous la même firebase database. Mais si vous utilisiez des systèmes de comptabilité pour différentes entresockets, je ne pense pas que ce serait acceptable (pour les entresockets, et peut-être pas pour les personnes morales) de partager des bases de données.

  • DÉVELOPPEMENT Pour un développement rapide, utilisez une firebase database par client. Pensez à la facilité avec laquelle vous pourrez sauvegarder, restaurer ou supprimer les données d’un client. Ou pour mesurer / surveiller / facturer l’utilisation. Vous n’avez pas besoin d’écrire du code pour le faire vous-même, utilisez simplement vos primitives de firebase database.

  • PERFORMANCE Pour les performances, utilisez une firebase database pour tous. Pensez au regroupement de connexions, à la mémoire partagée, à la mise en cache, etc.

  • BUSINESS Si votre plan d’affaires est d’avoir beaucoup de petits clients (pensez à hotmail), vous devriez probablement travailler sur une seule firebase database. Et avoir toutes les tâches administratives telles que l’enregistrement, la suppression, la migration de données, etc. entièrement automatisées et exposées dans une interface conviviale. Si vous prévoyez d’avoir des dizaines ou quelques centaines de gros clients, vous pouvez travailler dans une seule firebase database par client et disposer de scripts d’administration système pouvant être utilisés par votre équipe de support client.

Le screencast suivant explique comment cela se fait sur salesforce.com. Ils utilisent une firebase database avec une colonne spéciale OrgId qui identifie les données de chaque locataire. Il y a beaucoup plus à faire, alors vous devriez regarder ça. J’irais avec leur approche.

Il y a un autre excellent article à ce sujet sur MSDN. Cela explique en profondeur quand vous devez utiliser une approche partagée ou isolée. Rappelez-vous qu’avoir une firebase database partagée pour tous vos clients a des implications de sécurité importantes et si tous partagent les mêmes objects de firebase database que vous voudrez peut-être utiliser [sécurité au niveau des lignes] – selon le SGBD que vous utilisez SQL Server et Oracle, probablement dans IBM DB2 également). Vous pouvez utiliser des astuces comme la sécurité au niveau des lignes dans mySQL pour obtenir des résultats similaires (views + sortingggers).

Pour la multitinérance, les performances augmentent généralement plus les ressources que vous parvenez à partager entre les locataires, voir

http://en.wikipedia.org/wiki/Multitenancy

Donc, si vous le pouvez, allez avec la firebase database unique. Je suis d’accord que les problèmes de sécurité ne se produiraient que par des bogues, car vous pouvez implémenter tous les contrôles d’access dans l’application. Dans certaines bases de données, vous pouvez toujours utiliser le contrôle d’access à la firebase database en utilisant judicieusement les vues (afin que chaque utilisateur authentifié ait une vue différente).

Il y a des façons de fournir l’extensibilité également. Par exemple, vous pouvez créer une seule table avec des atsortingbuts d’extension (indexés par locataire, enregistrement de base et identificateur d’atsortingbut d’extension). Vous pouvez également créer des tables d’extension par client afin que chaque client dispose de son propre schéma d’extension.

Lorsque vous concevez une firebase database multi-utilisateurs, vous avez généralement trois options:

  1. Avoir une firebase database par locataire
  2. Avoir un schéma par locataire
  3. Tous les locataires partagent-ils la même table?

L’option que vous choisissez a des implications sur l’évolutivité, l’extensibilité et l’isolement. Ces implications ont été largement discutées à travers différentes questions et articles de la firebase database StackOverflow .

Dans la pratique, chacune des trois options de conception – avec un effort suffisant – peut répondre à des questions d’échelle, de données variables selon les locataires et d’isolement. La décision dépend de la dimension primaire que vous construisez. Le résumé:

  • Si vous construisez à l’échelle: Tous les locataires partagent-ils la même table?
  • Si vous prévoyez d’isoler: Créez une firebase database par locataire

Par exemple, Google et Salesforce suivent le premier modèle et font partager les mêmes tables à leurs locataires. Stackoverflow suit le second modèle et conserve une firebase database par locataire. La deuxième approche est également plus courante dans les secteurs réglementés, tels que les soins de santé.

La décision revient à la dimension primaire pour laquelle vous optimisez la conception de votre firebase database. Cet article sur la conception de votre firebase database SaaS à l’échelle traite des compromis et fournit un résumé dans le contexte de PostgreSQL.

Un autre point à prendre en compte est que vous pouvez avoir l’obligation légale de garder les données d’une entreprise séparées de celles des autres.

Avoir une firebase database par client en général n’est pas bien adapté. MySQL (et probablement d’autres bases de données) contient des ressources ouvertes par table, ce qui ne se prête pas bien aux tables 10k + sur une instance, ce qui se produirait dans une situation multitenancy à grande échelle.

Bien sûr, si vous rencontrez d’autres problèmes avant d’atteindre ce niveau, cela peut ne pas être pertinent.

En outre, le “sharding” d’une application multi-locataire est susceptible d’être la bonne chose à faire au fur et à mesure que votre application devient de plus en plus grande.

Sharding ne signifie toutefois pas une firebase database (ou instance) par locataire, mais une par partition ou un ensemble de fragments, chacun pouvant avoir plusieurs locataires. Vous aurez besoin de découvrir les bons parameters de réglage pour vous-même, probablement en production (par conséquent, il doit probablement être assez ajustable dès le départ)

€ Je ne peux pas le garantir

Vous pouvez commencer avec une seule firebase database et la partitionner au fur et à mesure que l’application se développe. Si vous faites cela, il y a quelques choses que je recommanderais:

1) Concevez la firebase database de manière à pouvoir facilement la partitionner. Par exemple, si les clients vont partager des données, assurez-vous que les données sont facilement répliquées dans chaque firebase database.

2) Lorsque vous n’avez qu’une seule firebase database, assurez-vous qu’elle est sauvegardée sur un autre serveur physique. En cas de basculement, vous pouvez rétablir le trafic vers cet autre serveur et conserver vos données intactes.