web-dev-qa-db-fra.com

Comment concevoir une base de données MySQL multi-locataire

Disons que j'ai besoin de concevoir une base de données qui hébergera des données pour plusieurs entreprises. Maintenant, pour des raisons de sécurité et d'administration, je dois m'assurer que les données de différentes entreprises sont correctement isolées, mais je ne souhaite pas non plus démarrer 10 processus MySQL pour héberger les données de 10 entreprises sur 10 serveurs différents. Quels sont les meilleurs moyens de le faire avec la base de données MySQL.

31
gaurav

Il existe plusieurs approches dans des bases de données multi-locataires. Pour la discussion, ils sont généralement divisés en trois catégories.

  • Une base de données par locataire.
  • Base de données partagée, un schéma par locataire.
  • Base de données partagée, schéma partagé. Un identifiant de locataire (clé de locataire) associe chaque rangée avec le bon locataire.

MSDN a un bon article sur les avantages et inconvénients de chaque conception et Exemples d'implémentations .


Pour référence, c'est le Lien d'origine pour le deuxième article

La solution simple est la suivante: pour chaque table partagée, ajoutez une colonne indique segment_id. Attribué à la bonne_id à chaque client. Créez ensuite des vues pour chaque clientèle sur le segment_id, ces vues conserveront des données séparées de chaque client. Avec cette méthode, les informations peuvent être partagées, le rendre simple pour le fonctionnement et le développement (la procédure stockée peut également être partagée) simple.

5
tintinhoking

En supposant que vous exécutiez une base de données MySQL sur une seule instance MySQL - il existe de plusieurs façons de distinguer ce qui appartient à qui. Le choix le plus évident (pour moi au moins) créerait une clé primaire composite telle que:

CREATE TABLE some_table (
id int unsigned not null auto_increment,
companyId int unsigned not null,
..
..
..,
primary key(id, company_id)
) engine = innodb;

puis distinguant les entreprises en modifiant la partie de la société principale de la clé principale. De cette façon, vous pouvez avoir toutes les données de toutes les entreprises de la même table/base de données et au niveau de l'application, vous pouvez contrôler la société liée à la société et déterminer les données à afficher pour certaines entreprises.

Si ce n'était pas ce que vous cherchiez - mes excuses pour mal comprendre votre question.

3
N.B.

Dans MySQL, je préfère utiliser une base de données unique pour tous les locataires. Je limite l'accès aux données à l'aide d'un utilisateur de base de données distinct pour chaque locataire qui n'a accès qu'à des vues qui ne montrent que des lignes appartenant à ce locataire.

Cela peut être fait par:

  1. Ajouter une colonne tenant_id à chaque table
  2. Utilisez un déclencheur pour remplir le tenant_id avec le nom d'utilisateur actuel de la base de données sur INSERT
  3. Créez une vue pour chaque table où tenant_id = actuel_database_USername
  4. Utilisez uniquement les vues de votre application
  5. Connectez-vous à la base de données à l'aide du nom d'utilisateur spécifique au locataire

J'ai complètement documenté cela dans un article de blog: https://opensource.io/it/mysql-multi-ten/

2
Rob Jenks

Compte tenu d'un utilisateur de DB spécifique, vous pouvez donner une adhésion à l'utilisateur au (x) groupe (s) indiquant que les sociétés dont ils sont autorisés à accéder.

Je présume que vous allez avoir une table Companies, alors créez simplement une relation unique entre Companies et MySQLUsers ou quelque chose de similaire.

Ensuite, comme condition de toutes vos questions, correspond à la touche CompanyID basée sur le UserID

1
Matthew

Avez-vous envisagé de créer un schéma différent pour chaque entreprise?

Vous devriez essayer de définir plus précisément ce que vous voulez réaliser, cependant.

Si vous souhaitez vous assurer qu'un échec HW ne compromet pas les données pour plus d'une entreprise, par exemple, vous devez créer des instances différentes et les exécuter sur différents nœuds.

Si vous voulez vous assurer que quelqu'un de la société A ne peut pas voir des données appartenant à la société B, vous pouvez le faire au niveau de l'application, conformément à la réponse Matthew PK, par exemple

Si vous voulez être sûr que quelqu'un qui parvient à compromettre la sécurité et à courir un SQL arbitraire contre la DB, vous avez besoin de quelque chose de plus robuste que cela.

Si vous souhaitez pouvoir sauvegarder des données de manière autonome pour que vous puissiez sauvegarder en toute sécurité la société C sur le lundi et la société A le dimanche et être en mesure de restaurer une seule entreprise C. Ensuite, une solution purement basée sur des applications ne vous aidera pas.

1
p.marino