Comment concevoir un multi-clients de base de données mysql
Permettez-nous de dire que j'ai besoin de concevoir une base de données qui sera l'hôte de données de plusieurs sociétés. Maintenant, pour la sécurité et la admin j'ai besoin de faire en sorte que les données pour les différentes entreprises est correctement isolé mais je ne veux pas commencer 10 mysql processus pour l'hébergement de données de 10 entreprises sur 10 serveurs différents. Quelles sont les meilleures façons de le faire avec la base de données mysql.
Vous devez vous connecter pour publier un commentaire.
Il existe plusieurs approches multi-bases de données mutualisées. Pour la discussion, ils sont généralement classées en trois catégories.
le locataire.
MSDN a un bon article sur le les avantages et les inconvénients de chaque modèle, et exemples de mises en œuvre.
Microsoft a apparemment pris de pages que j'ai évoqué, mais ils sont sur archive.org. Des liens ont été modifiés pour point là.
Pour la référence, c'est le lien d'origine pour le deuxième article
create schema
dans le standard SQL sens.create schema
dans MySQL est juste un synonyme decreate database
. DocsLa manière la plus simple est la suivante: pour chaque table partagée, ajouter une colonne dit SEGMENT_ID. Attribué bon SEGMENT_ID à chaque client. Ensuite, créer des vues pour chaque client base sur le SEGMENT_ID, Ces points de vue seront garder les données, séparés les uns des clients. Avec cette méthode, l'information peut être partagée, faire simple pour à la fois l'exploitation & développement (procédure stockée peut également être partagé) simple.
En supposant que vous passerais une base de données MySQL sur une seule instance MySQL - il y a plusieurs façons de distinguer entre ce qui est de l'appartenance à qui.
La plupart des choix évident (pour moi au moins) serait la création d'une clé primaire composite tels que:
puis distinguer entre les entreprises par la modification de la companyId partie de la clé primaire.
De cette façon, vous pouvez disposer de toutes les données de toutes les entreprises dans le même tableau /base de données et au niveau de l'application, vous pouvez contrôler ce que l'entreprise est liée à ce qui companyId et de déterminer les données à afficher pour la société.
Si ce n'est pas ce que vous avez été à la recherche pour - mes excuses pour le malentendu votre question.
Spécifique DB Utilisateur, vous pouvez donner à un utilisateur l'adhésion à groupe(s) indiquant les sociétés dont les données qu'ils sont autorisés à accéder.
Je suppose que vous allez avoir un
Companies
table, il suffit donc de créer un un-à-plusieurs relations entreCompanies
etMySQLUsers
ou quelque chose de similaire.Puis, comme condition à toutes vos questions, il suffit de faire coïncider la
CompanyID
basé sur laUserID
Avez-vous envisagé la création d'un autre schéma pour chaque entreprise?
Vous devriez essayer de définir plus précisément ce que vous voulez atteindre, cependant.
Si vous voulez assurez-vous que le HW échec de ne pas compromettre les données pour plus d'une entreprise, par exemple, vous devez créer différentes instances et de les exécuter sur différents nœuds.
Si vous voulez vous assurer que quelqu'un de la compagnie ne peut pas voir les données qui appartiennent à la société B, vous pouvez le faire au niveau de l'application, comme par Matthieu PK réponse, par exemple
Si vous voulez être sûr que quelqu'un qui parvient à compromettre la sécurité et exécuter des requêtes SQL à l'encontre de la DB vous avez besoin de quelque chose de plus robuste que celle, si.
Si vous voulez être en mesure de sauvegarder les données de manière indépendante, de sorte que vous pouvez en toute sécurité de la sauvegarde de l'Entreprise C un lundi ou Un dimanche et d'être en mesure de restaurer uniquement la société C puis, à nouveau, purement basée sur l'application de la solution ne va pas aider.
Dans MySQL, je préfère utiliser une base de données unique pour tous les locataires. Je restreindre l'accès aux données en utilisant un autre utilisateur de base de données pour chaque locataire qui n'a accès qu'aux vues d'afficher uniquement les lignes qui appartiennent à ce locataire.
Cela peut être fait par:
J'ai entièrement documenté ce dans un post de blog:
https://opensource.io/it/mysql-multi-tenant/