usuario una sistema seguro registro paso datos crear con completo como administrador php mysql saas multi-tenant

una - PHP SaaS multiusuario: ¿DB independientes para cada cliente, o agruparlos?



sistema de login php mysql completo (3)

Cuando hace muchos años diseñé Innomatic , la plataforma de código abierto para crear aplicaciones SaaS en PHP, opté por la tercera opción: el código de varios inquilinos y las bases de datos de un solo inquilino .

En mi experiencia, esa es la opción más escalable, pero también necesita un conjunto de scripts para propagar los cambios al actualizar el código, los esquemas de base de datos, habilitar las aplicaciones para un inquilino, etc.

Así que gran parte de mi esfuerzo fue construir un motor extensible basado en componentes para automatizar completamente todas esas tareas y minimizar las cosas de administración del sistema. Recomiendo encarecidamente construir una arquitectura de este tipo si desea adoptar la tercera opción.

Tendrás que tener paciencia conmigo para que la terminología pueda ser un poco incorrecta, ya que ni siquiera sabía que esto correspondía a la categoría de ''servicio'' de varios ''inquilinos'', pero aquí sí.

He desarrollado un sistema de membresía (en PHP) para un cliente. Ahora estamos considerando ofrecerlo como una solución completamente alojada para nuestros otros clientes, proporcionando un subdominio (o incluso su propio dominio).

Las opciones que parece tener sobre la mesa, en lo que respecta al almacenamiento de datos son:

Opción 1 : almacene todo en 1 gran base de datos y tenga un campo ''client_id'' en las tablas que lo necesitan (habría alrededor de 30 tablas a las que se aplicaría), y tenga una tabla de ''clientes'' que almacene sus configuraciones principales, detalles , etc y el dominio para mapearlos. Luego, esto solo establece una variable accesible globalmente que contiene su ID de cliente individual; obviamente, tendría que modificar cada consulta para verificar la columna client_id.

Opción 2 : tener una tabla maestra con las tablas de ''referencia compartida'' y la tabla de ''clientes''. Luego tenga ''bloques'' de otras bases de datos, que contienen cada una, por ejemplo, 10 clientes. El cliente obtendría sus propias tablas de base de datos, con el prefijo de su ID de cliente. Esto agrega un poco de seguridad para proteger contra la posibilidad de ver otros datos del cliente si algo salió realmente mal.

Opción 3 : exactamente lo mismo que la opción 2, excepto que tiene 1 base de datos para cada cliente, aislándolos por completo de otros clientes y, en teoría, ofrece un poco más de protección que si las tablas de 1 cliente se piratearan o dañaran de otro modo, no afectar a alguien mas El mayor inconveniente es que cuando se implementa un nuevo cliente, es necesario configurar una base de datos completa, el usuario y la contraseña, etc. Es posible que esto también cause una gran cantidad de sobrecarga, o sería más o menos lo mismo que si tuviera a todos en uno ¿base de datos?

También algunos puntos - algunos de estos clientes tendrán más de 5000 ''clientes'' junto con todos los detalles para esos clientes - esta es la razón por la cual la opción 1 puede ser un problema - si tengo 100 clientes, eso podría ser igual a Más de medio millón de filas en 1 mesa.

Estoy en lo correcto al pensar que la Opción 3 sería la mejor manera de hacerlo en una situación donde la seguridad de los datos del cliente (y la información de pago) es clave. De las recomendaciones que he tenido, algunas personas han dicho que opten por la opción 1 porque "es más fácil", pero realmente no lo veo así. Lo veo como un posible cuello de botella en la línea, ya que seguramente puedo mover a los clientes mucho más fácilmente si tienen su propia base de datos.

(Para su información, el sistema está basado en PHP con MySQL)


La opción 3 es la más escalable. Aunque al principio puede parecer más complicado, puede ser completamente automatizado y le ahorrará dolores de cabeza en el futuro. También puede escalar de manera más eficiente al tener bases de datos de clientes en varios servidores para aumentar el rendimiento.


Estoy de acuerdo con Ozzy: hice esto para un producto de base de datos en línea. Teníamos una base de datos maestra que básicamente tenía una tabla de usuario glorificada. Cada cliente tenía su propia base de datos. Lo bueno de esto es que pude mover una base de datos de clientes del servidor A al servidor B fácilmente [mysql] y podría hacerlo con herramientas de línea de comandos en caso de necesidad. También realizando tareas de mantenimiento en tablas grandes, la eliminación / adición de índices puede realmente arruinar su aplicación, especialmente si, por ejemplo, agregar un índice bloquea la tabla [mysql]. Afecta a todos. Con, presumiblemente, bases de datos más pequeñas, usted es más inmune a esto y tiene más opciones cuando necesita implementar cambios a nivel de esquema. Simplemente me gusta la flexibilidad.