J'essaie de déterminer quelle est la meilleure approche pour concevoir un schéma de base de données multi-locataires qui devra être partitionné horizontalement à l'avenir.
Quelques chiffres approximatifs sur la base de données
Le nombre total de locataires sera d'environ 10 000. La quantité de données stockées par locataire varie entre 500MB -> 3GB. Le nombre de locataires sera faible au départ et augmentera jusqu'à 10 000 en quelques années. Nous pouvons donc commencer par une seule base de données multilocataires, mais à long terme, elle devra évoluer horizontalement pour des raisons de performance. pour des raisons de performance.
Mise à jour - un facteur de complication est qu'occasionnellement les locataires (sociétés) peuvent fusionner ensemble et je dois également prendre en charge cette situation...,
La multilocation sera mise en œuvre à l'aide d'une base de données partagée et d'une architecture à schéma partagé, comme décrit dans le présent document. http://msdn.microsoft.com/en-us/library/aa479086.aspx
Étant donné que nous serons confrontés au partitionnement horizontal à l'avenir et qu'il est probable que nous déplacions les clients d'une base de données à une autre plusieurs fois avant que les choses ne se stabilisent, je pense qu'il est préférable d'utiliser les GUID comme clés primaires sur chaque table ainsi qu'une colonne unique tenantID.
Je sais que l'utilisation de GUID comme clé primaire entraîne une surcharge de performance, mais est-ce un compromis que je dois accepter ? Existe-t-il un autre moyen de concevoir un partitionnement horizontal à l'avenir ?
Voici un exemple : disons que je veux fusionner des entreprises avec des locataires 100 et 200 dans le futur, si le PK est un entier, il peut y avoir une collision lorsque je copie les lignes de la base de données 2 vers la base de données 1, avec {guids} je suis sûr qu'il n'y aura pas de collision...
base de données 1 base de données 2 tenantid, id, description tenantid, id, description 100 ,1 , "foo" 200 ,1 , "xxx" 100 ,2 , "boo" 20 100 ,2 , 'boo' 200 ,2 , 'yyy
base de données 1 base de données 2 tenantid, id, description tenantid, id, description 100 ,{aaa} , 'foo' 200 ,{ccc} , 'xxx' 100 ,{bbb} , 'boo' 200 ,{ddd} , 'yyy