2011-04-06 16 views
19

Digamos que necesito diseñar una base de datos que alojará datos para múltiples compañías. Ahora, para fines de seguridad y administración, debo asegurarme de que los datos de las diferentes compañías estén aislados correctamente, pero tampoco quiero iniciar 10 procesos mysql para alojar los datos de 10 empresas en 10 servidores diferentes. ¿Cuáles son las mejores formas de hacerlo con la base de datos mysql?Cómo diseñar una base de datos mysql multi-tenant

Respuesta

25

Existen varios enfoques para las bases de datos de múltiples inquilinos. Para la discusión, por lo general se dividen en tres categorías.

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

MSDN tiene un buen artículo sobre pros and cons of each design y examples of implementations.

+0

¿Puede ayudar la fragmentación en este caso, con cada fragmento conteniendo datos para un cliente separado? – gaurav

+1

El espectro abarca desde "nada compartido" (una base de datos por inquilino) hasta "compartir todo" (clave de inquilino en cada tabla). Sharding está cerca del extremo del espectro "compartido de todo". Espero que simplifique la recuperación ante desastres para un único inquilino. Si puede imaginarse un sistema "compartido de todo" en un solo servidor, recuperar datos para un único inquilino significa recuperar solo algunas de las filas en cada tabla compartida. Eso no es solo simplemente muerto. –

+0

¿MySQL soporta sachems múltiples de base de datos única? – Sagar

4

Suponiendo que ejecute una base de datos MySQL en una sola instancia de MySQL, hay varias maneras de distinguir entre lo que pertenece a quién. opción más obvia (al menos para mí) sería la creación de una clave principal 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 empresas, cambiando la parte CompanyID de la clave primaria. De esta forma puede tener todos los datos de todas las empresas 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 determinada compañía.

Si esto no era lo que buscaba, le pido disculpas por no haber entendido bien su pregunta.

+0

Mi idea es aislar los datos hasta cierto punto para que haya identificadores únicos de inicio de sesión para cada base de datos de la compañía. Entonces, digamos que si se produce un compromiso de seguridad en la empresa A, los datos de la empresa B deberían ser seguros. – gaurav

+0

@ I.Tyger ¿incluso codifica? –

+0

@ I. Apúntate bien, porque has publicado un comentario que no tiene sentido. Supongo que estás aquí para aprender, está bien. Buena suerte. No publiques tonterías por favor, es molesto ver el punto rojo sin ningún motivo. –

1

Dado un usuario de base de datos específico, podría otorgar una membresía de usuario a un grupo (s) indicando las compañías a las que tienen acceso.

supongo que vas a tener una mesa Companies, por lo que acaba de crear una relación de uno a muchos entre Companies y MySQLUsers o algo similar.

Entonces, como condición para todas sus consultas, simplemente coincidir con el CompanyID basado en la UserID

1

¿Ha considerado la creación de una diferente schema para cada empresa?

Sin embargo, debe tratar de definir con mayor precisión lo que quiere lograr.

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

Si desea asegurarse de que alguien de la empresa A no puede ver los datos que pertenecen a la empresa B se puede hacer eso a nivel de aplicación de acuerdo con la respuesta Mateo PK, por ejemplo

Si usted quiere estar seguro de que Alguien que se las arregla para comprometer la seguridad y ejecutar SQL arbitrario contra el DB necesita algo más sólido que eso, sin embargo.

Si desea poder realizar una copia de seguridad de los datos de forma independiente para poder hacer copias de seguridad de la Compañía C los lunes y la Compañía A los domingos y restaurar solo la compañía C, una solución puramente basada en aplicaciones no ayuda.

+0

Quiero hacer algo como lo mencionaste en tu último punto. Haga las copias de seguridad de forma independiente, mantenga los datos aislados hasta cierto punto, de modo que si una empresa recibe mucho tráfico, muévalos a una instancia completamente nueva en una máquina diferente. – gaurav

+0

Luego, eche un vistazo a los esquemas, no tengo mucha experiencia con mySql, así que es posible que me falte algún detalle específico de la implementación, pero creo que es el mejor enfoque en su caso. –

3

La manera simple es: para cada tabla compartida, agregue una columna que diga SEGMENT_ID. Asignado SEGMENT_ID adecuado a cada cliente. A continuación, 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, hacer que sea simple para el desarrollo de la operación & (procedimiento almacenado también se puede compartir) simple.

+4

SEGMENT_ID es un nombre terrible –

+7

TENANT_ID es el nombre perfecto – Nabeel

Cuestiones relacionadas