SaaS de PHP para múltiples inquilinos: ¿DB independientes para cada cliente, o agruparlos?

Tendrá 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 en la tabla, 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.

opcion 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.

Opcion 3 - Exactamente lo mismo que la opción 2, excepto que tiene 1 base de datos para cada cliente, aislándolos completamente de otros clientes y, en teoría, brindando un poco más de protección que si las tablas de 1 cliente fueran hackeadas o dañadas, no afectaría a nadie. más. 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 cierto 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)

Respuestas a la pregunta(3)

Su respuesta a la pregunta