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.
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.
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.
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.
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:
J'ai complètement documenté cela dans un article de blog: https://opensource.io/it/mysql-multi-ten/
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
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.