65 votes

Quels sont les avantages d'utiliser une base de données unique pour chaque client?

Dans une base de données centrée sur l'application qui est conçu pour de multiples clients, j'ai toujours pensé que c'était "mieux" pour utiliser une base de données unique pour TOUS les clients - associe dans ce cas des dossiers avec un bon index et les clés. En écoutant le Débordement de Pile podcast, j'ai entendu Joel mentionner que FogBugz utilise une base de données par client (donc si il y avait 1000 clients, il n'y aurait 1000 bases de données). Quels sont les avantages de l'utilisation de cette architecture?

Je comprends que, pour certains projets, les clients ont besoin d'un accès direct à l'ensemble de leurs données dans une application, il est évident que chaque client a besoin de leur propre base de données. Toutefois, pour les projets où un client n'a pas besoin d'accéder à la base de données directement, existe-il des avantages à utiliser une base de données par client? Il semble qu'en termes de flexibilité, il est beaucoup plus simple d'utiliser une base de données unique avec un seul exemplaire de la tables. Il est plus facile d'ajouter de nouvelles fonctionnalités, il est plus facile de créer des rapports, et c'est plus facile à gérer.

J'étais assez confiant dans le "une base de données pour tous les clients" méthode jusqu'à ce que j'ai entendu Joel (un développeur expérimenté) mentionnent que son logiciel utilise une approche différente, et je suis un peu confus avec sa décision...

J'ai entendu des gens citer que les bases de données de ralentir avec un grand nombre de documents, mais aucune base de données relationnelles avec certains de mérite n'allez pas avoir ce problème, en particulier si bon index et les clés sont utilisés.

Toute contribution est grandement appréciée!

47voto

Adam Wright Points 31715

Supposons il n'y a pas d'échelle de pénalité pour le stockage de tous les clients dans une base de données; pour la plupart des gens, et bien configuré bases de données/requêtes, ce sera assez vrai de nos jours. Si vous n'êtes pas une de ces personnes, bien, alors le bénéfice d'une base de données unique est évident.

Dans cette situation, les avantages de l'encapsulation de chaque client. À partir de la perspective de code, chaque client existe dans l'isolement - il n'est pas possible de la situation dans laquelle une base de données mise à jour risque d'écraser, de la corruption, de récupérer ou de modifier des données appartenant à un autre client. Cela simplifie également le modèle, que vous n'avez pas besoin de considérer le fait que les enregistrements peuvent appartenir à un autre client.

Vous bénéficiez également des avantages de la divisibilité - il est trivial d'extraire les données associées à un client donné ,et de les déplacer vers un autre serveur. Ou de restaurer une sauvegarde du client lors de l'appel jusqu'à dire "Nous avons supprimé des données de la clé!", à l'aide de la base de données builtin mécanismes.

Vous obtenez facile et gratuit serveur de mobilité - si vous outscale un serveur de base de données, il vous suffit d'accueil de nouveaux clients sur un autre serveur. Si ils étaient tous dans une seule base de données, vous devez soit obtenir plus costaud de matériel, ou d'exécuter la base de données sur plusieurs machines.

Vous obtenez facilement les versions si un client veut rester sur la version logicielle 1.0, et une autre veut 2.0, où 1.0 et 2.0 utilisation de différents schémas de base de données, il n'y a pas de problème - vous pouvez migrer un sans avoir à les extraire d'une base de données.

Je ne peux penser à quelques dizaines de plus, je suppose. Mais dans l'ensemble, le concept clé est "simplicité". Le produit gère un client, et donc une base de données. Il n'est jamais toute la complexité de la "Mais la base de données contient également d'autres clients". Il s'adapte au modèle mental de l'utilisateur, lorsqu'ils existent, seul. Avantages comme le fait de pouvoir faire facilement des rapports sur tous les clients à la fois, sont minimes - combien de fois voulez-vous un rapport sur le monde entier, plutôt que juste un client?

13voto

The How-To Geek Points 703

Voici une approche que j'ai vu avant:

  • Chaque client dispose d'une unique chaîne de connexion stockées dans un maître de la base de données clients.
  • La base de données est conçue de telle sorte que tout est segmenté par code client, même si il y a un seul client sur une base de données.
  • Les Scripts sont créés pour migrer toutes les données du client à une nouvelle base de données si nécessaire, et ensuite seulement que la clientèle de la chaîne de connexion doit être mis à jour pour pointer vers le nouvel emplacement.

Cela permet d'utiliser une seule base de données au début, et puis segmentation plus tard, une fois que vous avez un grand nombre de clients, ou plus fréquemment lorsque vous avez un couple de clients que l'utilisation abusive du système.

J'ai trouvé que le rétablissement de la clientèle spécifique des données est vraiment difficile lorsque toutes les données sont dans la même base de données, mais la gestion des mises à jour est beaucoup plus simple.

Lors de l'utilisation d'une base de données unique par client, vous avez un énorme problème de la garde de tous les clients à la même version de schéma, et qui ne prend même pas en considération les travaux de sauvegarde de tout un tas de clients des bases de données spécifiques. Naturellement, la restauration des données est plus facile, mais si vous veillez à ne pas supprimer définitivement les dossiers (il suffit de marquer avec un drapeau supprimé ou les déplacer vers une table d'archive), alors vous avez moins besoin de restauration de base de données en premier lieu.

11voto

bruceatk Points 4226

Pour rester simple. Vous pouvez être sûr que votre client ne voit que ses données. Le client avec moins d’enregistrements n’a pas à payer l’alourdissement dû à la concurrence avec des centaines de milliers d’enregistrements pouvant se trouver dans la base de données mais pas les leurs. Peu m'importe comment tout est bien indexé et optimisé, il y aura des requêtes qui détermineront qu'elles doivent analyser chaque enregistrement.

10voto

Lasse V. Karlsen Points 148037

Eh bien, que si l'un de vos clients vous dit de restaurer une version antérieure de leurs données en raison de certaines bâclé travail d'importation ou similaires? Imaginez comment vos clients peuvent sentir si vous leur a dit "vous ne pouvez pas le faire, puisque vos données sont partagées entre tous nos clients" ou "Désolé, mais vos modifications ont été perdus parce que le client X a exigé une restauration de la base de données".

9voto

Nathan Points 5352

Comme pour la douleur de la mise à niveau de 1000 serveurs de base de données à la fois, assez simple d'automatisation doit prendre soin de cela. Aussi longtemps que chaque base de données maintient un schéma identique, alors il ne sera pas vraiment un problème. Nous utilisons également la base de données par l'approche client, et il fonctionne bien pour nous.

Voici un article sur ce sujet (oui, c'est MSDN, mais elle est indépendante de la technologie de l'article): http://msdn.microsoft.com/en-us/library/aa479086.aspx.

Une autre discussion de multi-tenant, comme il se rapporte à votre modèle de données ici: http://www.ayende.com/Blog/archive/2008/08/07/Multi-Tenancy--The-Physical-Data-Model.aspx

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X