unir una tablas tabla relacionadas que inner hacer diferentes datos consultas consultar consulta como sql mysql database-design multi-tenant

una - unir dos tablas sql server



¿Cómo crear una base de datos de múltiples usuarios con estructuras de tablas compartidas? (4)

Sin embargo, hay algunas empresas que temen que sus datos se vean comprometidos, por lo que estamos evaluando otras soluciones.

Esto es desafortunado, ya que a veces los clientes tienen una idea errónea de que solo el aislamiento físico puede ofrecer suficiente seguridad.

Hay un artículo interesante de MSDN, titulado Arquitectura de datos de inquilinos múltiples , que es posible que desee verificar. Así es como los autores abordaron la idea errónea del enfoque compartido:

Un concepto erróneo común sostiene que solo el aislamiento físico puede proporcionar un nivel apropiado de seguridad. De hecho, los datos almacenados utilizando un enfoque compartido también pueden proporcionar una sólida seguridad de los datos, pero requieren el uso de patrones de diseño más sofisticados.

En cuanto a las consideraciones técnicas y comerciales, el artículo hace un breve análisis sobre dónde un cierto enfoque podría ser más apropiado que otro:

El número, la naturaleza y las necesidades de los inquilinos que espera atender afectan su decisión de arquitectura de datos de diferentes maneras. Algunas de las siguientes preguntas pueden inclinarlo hacia un enfoque más aislado, mientras que otras pueden inclinarlo hacia un enfoque más compartido.

  • ¿A cuántos posibles inquilinos espera apuntar? Puede que no esté cerca de poder estimar el uso prospectivo con autoridad, pero piense en términos de órdenes de magnitud: ¿está construyendo una aplicación para cientos de inquilinos? ¿Miles? ¿Decenas de miles? ¿Más? Mientras más grande espere que sea su base de inquilinos, es más probable que desee considerar un enfoque más compartido.

  • ¿Cuánto espacio de almacenamiento espera que ocupen los datos promedio del inquilino? Si espera que algunos o todos los inquilinos almacenen grandes cantidades de datos, el enfoque de base de datos separada es probablemente el mejor. (De hecho, los requisitos de almacenamiento de datos pueden forzarlo a adoptar un modelo de base de datos independiente de todos modos. De ser así, será mucho más fácil diseñar la aplicación de esa manera desde el principio que pasar luego a un enfoque de base de datos separada).

  • ¿Cuántos usuarios finales concurrentes espera que soporte el inquilino promedio? Cuanto mayor sea el número, más apropiado será un enfoque más aislado para cumplir con los requisitos del usuario final.

  • ¿Espera ofrecer algún servicio de valor agregado por inquilino, como respaldo por inquilino y capacidad de restauración? Dichos servicios son más fáciles de ofrecer a través de un enfoque más aislado.

ACTUALIZACIÓN: Además de actualizar sobre el número esperado de inquilinos.

Ese número esperado de inquilinos (10k) debería excluir el enfoque de múltiples bases de datos, para la mayoría, si no todos los escenarios. No creo que te apetezca la idea de mantener 10.000 instancias de base de datos y tener que crear cientos de nuevas cada día.

Solo desde ese parámetro, parece que el enfoque de base de datos compartida, de un solo esquema es el más adecuado. El hecho de que almacene unos 50Mb por inquilino y que no haya complementos por inquilino hace que este enfoque sea aún más apropiado.

El artículo de MSDN citado anteriormente menciona tres patrones de seguridad que abordan consideraciones de seguridad para el enfoque de base de datos compartida:

Cuando tenga confianza con las medidas de seguridad de datos de su aplicación, podrá ofrecer a sus clientes un acuerdo de nivel de servicio que brinde sólidas garantías de seguridad de datos. En su SLA, además de las garantías, también podría describir las medidas que tomaría para garantizar que los datos no se vean comprometidos.

ACTUALIZACIÓN 2: Al parecer, los chicos de Microsoft se mudaron / hicieron un nuevo artículo sobre este tema, el enlace original se ha ido y este es el nuevo: Multi-tenant SaaS base de datos de los patrones de tenencia (felicitaciones a Shai Kerer)

Nuestro software actualmente se ejecuta en MySQL. Los datos de todos los inquilinos se almacenan en el mismo esquema. Como usamos Ruby on Rails, podemos determinar fácilmente qué datos pertenecen a cada inquilino. Sin embargo, hay algunas empresas que temen que sus datos se vean comprometidos, por lo que estamos evaluando otras soluciones.

Hasta ahora he visto tres opciones:

  • Multi-Base de Datos (cada inquilino tiene lo suyo, casi lo mismo que 1 servidor por cliente)
  • Multi-Schema (no disponible en MySQL, cada inquilino obtiene su propio esquema en una base de datos compartida)
  • Esquema compartido (nuestro enfoque actual, tal vez con un registro de identificación adicional en cada columna)

Multi-Schema es mi favorito (teniendo en cuenta los costos). Sin embargo, crear una nueva cuenta y hacer migraciones parece ser bastante doloroso, porque tendría que iterar sobre todos los esquemas y cambiar sus tablas / columnas / definiciones.

P: Multi-Schema parece estar diseñado para tener tablas ligeramente diferentes para cada inquilino. No quiero esto. ¿Hay algún RDBMS que me permita utilizar una solución de múltiples inquilinos de múltiples esquemas, donde la estructura de la tabla se comparte entre todos los inquilinos?

PD Por multi me refiero a algo así como ultra-multi (más de 10.000 inquilinos).


A continuación se incluye un enlace a un libro blanco en Salesforce.com sobre cómo implementan multi-tenancy:

http://www.developerforce.com/media/ForcedotcomBookLibrary/Force.com_Multitenancy_WP_101508.pdf

Tienen 1 tabla enorme con 500 columnas de cadena (Valor0, Valor1, ... Valor500). Las fechas y los números se almacenan como cadenas en un formato tal que se pueden convertir a sus tipos nativos en el nivel de la base de datos. Hay tablas de metadatos que definen la forma del modelo de datos que puede ser único por inquilino. Hay tablas adicionales para indexación, relaciones, valores únicos, etc.

¿Por qué la molestia?

Cada inquilino puede personalizar su propio esquema de datos en tiempo de ejecución sin tener que realizar cambios en el nivel de la base de datos (después de la tabla, etc.). Esta es definitivamente la manera más difícil de hacer algo como esto, pero es muy flexible.


Como mencionas, la base de datos por inquilino es una opción y tiene algunas compensaciones más grandes con ella. Puede funcionar bien a menor escala, como un solo dígito o bajo 10 de inquilinos, pero más allá de eso, se vuelve más difícil de gestionar. Ambas son solo migraciones, pero también solo para mantener las bases de datos en funcionamiento.

El modelo por esquema no solo es útil para esquemas exclusivos para cada uno, aunque seguir ejecutando migraciones entre todos los inquilinos se vuelve difícil y en 1000''s de esquemas, Postgres puede comenzar a tener problemas.

Un enfoque más escalable es tener absolutamente a los inquilinos distribuidos aleatoriamente, almacenados en la misma base de datos, pero a través de diferentes fragmentos lógicos (o tables ). Dependiendo de su idioma, hay varias bibliotecas que pueden ayudar con esto. Si está utilizando Rails, hay una biblioteca para evitar el inquilinato acts_as_tenant , esto ayuda a asegurar que sus consultas de inquilinos solo acts_as_tenant esos datos. También hay un apartment gemas: aunque utiliza el modelo de esquema, ayuda con las migraciones en todos los esquemas. Si está usando Django, hay un número, pero uno de los más populares parece estar en los schemas . Todos estos ayudan más en el nivel de aplicación. Si busca algo más a nivel de la base de datos directamente, Citus se centra en hacer que este tipo de fragmentación para el trabajo multicliente sea más rápido con Postgres.


Mi experiencia (aunque sea SQL Server) es que la base de datos múltiple es el camino a seguir, donde cada cliente tiene su propia base de datos. Entonces, aunque no tengo experiencia mySQL o Ruby On Rails, espero que mi entrada agregue algún valor.

Las razones por las cuales incluyen:

  1. seguridad de datos / recuperación de desastres. Los datos de cada compañía se almacenan completamente separados de otros, lo que reduce el riesgo de que los datos se vean comprometidos (pensando cosas como si introdujese una falla en el código que significa que algo mira erróneamente otros datos del cliente cuando no debería), minimiza la pérdida potencial de un cliente una base de datos particular se corrompe, etc. Los beneficios de seguridad percibidos para el cliente son aún mayores (¡efecto secundario añadido adicional!)
  2. escalabilidad. Básicamente, usted dividiría sus datos para permitir una mayor escalabilidad, por ejemplo, las bases de datos se pueden poner en diferentes discos, puede poner varios servidores de bases de datos en línea y mover bases de datos para distribuir la carga más fácilmente.
  3. la optimización del rendimiento. Supongamos que tiene un cliente muy grande y uno muy pequeño. Los patrones de uso, los volúmenes de datos, etc. pueden variar mucho. Puede sintonizar / optimizar más fácilmente para cada cliente si lo necesita.

¡Espero que esto ofrezca una aportación útil! Hay más razones, pero mi mente se quedó en blanco. Si vuelve a funcionar, lo actualizaré :)

EDITAR:
Desde que publiqué esta respuesta, ahora está claro que estamos hablando de más de 10,000 inquilinos. Mi experiencia está en cientos de bases de datos a gran escala. No creo que 10.000 bases de datos separadas sean demasiado manejables para su escenario, por lo que ahora no estoy a favor del enfoque multi-db para su escenario. ¡Especialmente cuando ahora está claro que estás hablando de pequeños volúmenes de datos para cada inquilino!

Mantener mi respuesta aquí como de todos modos, ya que puede ser útil para otras personas en un barco similar (con menos inquilinos)