Je réfléchis à un problème de conception de base de données. Toute aide serait très appréciée.
Nous concevons une application qui comprend 20 tables (qui peuvent atteindre environ 30 maximum au cours du développement de nouvelles fonctionnalités)
La pile technologique
MVC4, .NET 4.X, Entity Framework 5, SQL Server 2012, framework d'adhésion ASP.NET
Nombre d'utilisateurs
Nous avons l'intention de répondre à environ 1000 clients qui auraient en moyenne 20 utilisateurs.
La question
Si nous concevons la base de données et l'application de manière à ce que les tables soient logiquement partitionnées, c'est-à-dire que tous les clients utilisent les mêmes tables avec un guide de partition pour séparer les données.
OR
Optez pour plusieurs bases de données qui pourraient s'avérer difficiles lors du lancement de nouvelles fonctionnalités et de la correction de bogues. MAIS pourrait potentiellement permettre une mise à l'échelle?
Avertissements: l'une des tables a une colonne binaire qui stocke les fichiers (maximum 5 Mo par enregistrement)
En plus de cela, nous devons prendre en compte les tables de structure d'adhésion, que nous étendrons à une autre table personnalisée et mapperons logiquement les utilisateurs à un guide de partition.
Vous souhaiterez avoir utilisé des bases de données distinctes:
AND CustomerID = @CustomerID
. Astuce: utilisez un outil d'autorisations scripté, ou des schémas, ou encapsulez toutes les tables avec des vues qui incluent WHERE CustomerID = SomeUserReturningFunction()
, ou une combinaison de celles-ci.Customer
parce que WHERE CustomerID = @CustomerID
Ne le coupera pas maintenant.Vous serez heureux d'avoir utilisé des bases de données distinctes:
Vous souhaiteriez avoir utilisé une seule base de données:
Ce n'est pas parce que j'ai énuméré plus de raisons pour cela que c'est mieux.
Certains lecteurs peuvent tirer profit de MSDN: Multi-Tenant Data Architecture . Ou peut-être modèles de conception d'applications SaaS Tenancy . Ou même Developing Multi-tenant Applications for the Cloud, 3rd Edition
Si vous référez votre architecture comme "multi locataire", Microsoft a un bon article qui vaut la peine d'être lu ici . Il montre une comparaison entre "isolated" (multiple db)
et "shared" (single db)
. En général, le partage gagne lorsque le nombre de locataires (client) est important, mais lorsque la taille de chaque locataire est importante, une approche isolée est recommandée.
Cependant, ces considérations ne peuvent être calculées que par des développeurs expérimentés.
Néanmoins, si vous avez réussi à utiliser l'architecture isolated (multiple db)
, vous avez toujours vous n'obtiendrez pas d'avantages directs en termes de performances lorsqu'ils sont toujours exécutés sur la même instance . Et si vous utilisez l'architecture shared (single db)
, pensez à utiliser int
au lieu de guid
, ou sequential guid
si vous devez encore l'utiliser.