tutorial tenant tenancy single multi inquilino informatica hyn mysql database database-design multi-tenant

mysql - tenancy - single tenant



Cómo diseñar una base de datos mysql multi tenant (6)

¿Ha considerado crear un schema diferente para cada empresa?

Sin embargo, deberías tratar de definir más precisamente lo que quieres lograr.

Si desea asegurarse de que una falla de HW no comprometa los datos de más de una compañía, por ejemplo, debe crear instancias diferentes y ejecutarlas en nodos diferentes.

Si desea asegurarse de que alguien de la compañía A no pueda ver los datos que pertenecen a la compañía B, puede hacerlo en el nivel de la aplicación, según la respuesta de Matthew PK, por ejemplo

Sin embargo, si quiere asegurarse de que alguien que se comprometa con la seguridad y ejecute SQL arbitrario contra la base de datos, necesitará algo más sólido que eso.

Si desea poder hacer una copia de seguridad de los datos de manera independiente para poder hacer una copia de seguridad segura de la Compañía C los lunes y la Compañía A los domingos y poder restaurar solo la Compañía C, una solución puramente basada en aplicaciones no ayudará.

Digamos que necesito diseñar una base de datos que alojará datos para varias compañías. Ahora, por motivos de seguridad y administración, debo asegurarme de que los datos de diferentes compañías estén correctamente aislados, pero tampoco quiero iniciar 10 procesos de mysql para alojar los datos de 10 compañías en 10 servidores diferentes. ¿Cuáles son las mejores maneras de hacer esto con la base de datos mysql?


Dado un usuario de base de datos específico, puede otorgar una membresía de usuario a un grupo (s) que indique las compañías a las que pueden acceder sus datos.

Supongo que va a tener una tabla de Companies , así que cree una relación de uno a muchos entre Companies y MySQLUsers o algo similar.

Luego, como condición de todas sus consultas, solo CompanyID coincidir el CompanyID basado en el UserID


En MySQL prefiero usar una sola base de datos para todos los inquilinos. Restrinjo el acceso a los datos utilizando un usuario de base de datos independiente para cada inquilino que solo tiene acceso a las vistas que solo muestran filas que pertenecen a ese inquilino.

Esto se puede hacer por:

  1. Agregar una columna tenant_id a cada tabla
  2. Use un disparador para rellenar el tenant_id con el nombre de usuario de la base de datos actual al insertar
  3. Cree una vista para cada tabla donde tenant_id = current_database_username
  4. Solo utiliza las vistas en tu aplicación.
  5. Conéctese a la base de datos utilizando el nombre de usuario específico del arrendatario

Lo he documentado completamente en una entrada de blog: https://opensource.io/it/mysql-multi-tenant/


Hay varios enfoques para bases de datos de múltiples inquilinos. Para discusión, generalmente se dividen en tres categorías.

  • Una base de datos por inquilino.
  • Base de datos compartida, un esquema por arrendatario.
  • Base de datos compartida, esquema compartido. Un identificador de inquilino (clave de inquilino) asocia cada fila con el inquilino correcto.

MSDN tiene un buen artículo sobre las ventajas y desventajas de cada diseño y ejemplos de implementaciones .

Microsoft aparentemente ha eliminado las páginas a las que me he referido, pero la primera está en archive.org. He cambiado el enlace para apuntar allí. Todavía no he encontrado el segundo.

La forma más sencilla es: para cada tabla compartida, agregue una columna que diga SEGMENT_ID. Asignar SEGMENT_ID adecuado a cada cliente. Luego cree vistas para cada base de clientes en SEGMENT_ID. Estas vistas mantendrán los datos separados de cada cliente. Con este método, la información se puede compartir, simplificando tanto la operación como el desarrollo (el procedimiento almacenado también se puede compartir).


Suponiendo que ejecutaría una base de datos MySQL en una sola instancia de MySQL, hay varias maneras de distinguir entre qué pertenece a quién. La elección más obvia (al menos para mí) sería crear una clave primaria compuesta como:

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

y luego distinguir entre compañías cambiando la parte de la clave principal de companyId. De esa manera, puede tener todos los datos de todas las compañías en la misma tabla / base de datos y, a nivel de aplicación, puede controlar qué compañía está vinculada a qué ID de compañía y determinar qué datos mostrar para cierta compañía.

Si esto no era lo que buscabas, mis disculpas por malinterpretar tu pregunta.