Antes de sumergirnos en el tema principal de este artículo, primero hablemos un poco sobre lo que es el arrendamiento múltiple. Según Wikipedia,
"El término " software multiusuario " se refiere a una arquitectura de software en la que una sola instancia del software se ejecuta en un servidor y atiende a múltiples usuarios. Un usuario es un grupo de usuarios que comparten un acceso común con privilegios específicos a la instancia de software. "
El caso de uso más común para los sistemas multiusuario son las aplicaciones basadas en SaaS, que utilizan diferentes niveles de aislamiento de datos según el dominio de la aplicación.
Supongamos que tiene un producto que desea proporcionar a varias organizaciones para que sus usuarios puedan iniciar sesión en la plataforma y utilizar el servicio.
La solución más simple sería copiar su código base para cada organización e implementarlos por separado. Parece intuitivo pero difícil de mantener, ya que hay una sobrecarga de administrar múltiples servidores.
Siempre que su equipo de desarrollo necesite agregar una nueva función, debe seguir una serie de implementaciones. Con una arquitectura multiinquilino , este problema podría abordarse fácilmente, lo que daría como resultado una base de código coherente, ya que ahora el equipo tiene que mantener una única base de código. De acuerdo con nuestro ejemplo, los inquilinos podrían ser las organizaciones que utilizan nuestro producto.
Hay varias arquitecturas que se pueden seguir para lograr la tenencia múltiple en la capa de la base de datos, que incluyen:
Hay toneladas de artículos disponibles en Internet para ayudar a comprender el concepto de tenencia múltiple. Aquí vamos a hablar sobre un tipo específico de multiusuario, es decir, multiusuario basado en esquemas, y cómo lo implementa exactamente PostgreSQL.
En este tipo de arrendamiento múltiple, creamos varios esquemas en la misma base de datos para brindar aislamiento de datos a los arrendatarios. En tiempo de ejecución, según los criterios para resolver el arrendatario, las solicitudes se redirigen al esquema específico. Podría haber varias formas de hacerlo, por ejemplo, subdominios únicos, etc.
Sin hablar mucho, encendamos la terminal y veamos cómo funciona.
Abra la consola de Postgres
psql postgres
Cree una nueva base de datos usando el siguiente comando
CREATE database test;
Echa un vistazo a la ruta de búsqueda de esquemas
SHOW search_path;
Esta ruta de búsqueda determina qué esquemas se examinarán para buscar una tabla o relación de izquierda a derecha y el conjunto de resultados se devolverá en función de la tabla que se encuentre primero.
Ahora, creemos un nuevo arrendatario o, en términos de Postgres, un nuevo esquema.
CREATE schema tenant_one;
Para cambiar al nuevo esquema, modifiquemos la ruta de búsqueda del esquema.
SET search_path TO tenant_one, public;
Crear una nueva tabla para los usuarios ahora
CREATE table users (name varchar, age int);
Puede listar las tablas usando los siguientes comandos.
\dt
Esto enumerará todas las tablas en el esquema actual.
Bien, ahora, creemos otro esquema y cambiemos a él.
CREATE schema tenant_two; SET search_path TO tenant_two, public;
Haz una lista de las tablas.
\dt
Como puede ver, no hay tablas aquí, es posible que se pregunte a dónde fue la tabla de usuarios que creamos anteriormente. Reside bajo el esquema de inquilino_uno y actualmente nuestra ruta de búsqueda está configurada para buscar solo en el esquema de inquilino_dos y público.
Vamos a crear una nueva tabla aquí también.
CREATE table users (name varchar, age int);
Ahora, deberíamos poder ver la tabla de usuarios.
\dt
Avancemos y creemos un nuevo registro en la tabla de usuarios.
Insert into users values ('tenant_two user', 21 );
Enumere el registro que acabamos de crear.
Select * from users;
Vuelva a modificar la ruta de búsqueda del esquema y cambie a tenant_one para obtener la lista de usuarios.
SET search_path TO tenant_one, public; Select * from users;
El registro que creamos anteriormente no se muestra porque actualizamos la ruta de búsqueda del esquema.
Insert into users values ('tenant_one_user', 22 ) Select * from users;
Deberíamos poder obtener la lista ahora.
Siéntase libre de actualizar la ruta del esquema y jugar.
¿Qué sucede si ambos esquemas están presentes en la ruta de búsqueda?
En este caso, Postgres nos dará los resultados del esquema en el que se encuentra la tabla primero de izquierda a derecha.
SET search_path TO public, tenant_one, tenant_two; Select * from users;
Como puede ver, el usuario de tenant_one es la lista de registros. Modifiquemos la ruta de búsqueda nuevamente y verifiquemos los resultados.
SET search_path TO tenant_two, public, tenant_one; Select * from users;
Esta vez, aparece el usuario de inquilino_dos, ya que la relación se encontraría primero en inquilino_dos y se devuelve el conjunto de resultados.
Esta fue una idea básica de cómo se realizan las búsquedas basadas en esquemas. Hay muchas bibliotecas disponibles que brindan soporte para manejar múltiples inquilinos en su aplicación. Si eres del mundo Ruby, te recomiendo que visites la joya Apartment . Puede especificar si desea utilizar el arrendamiento múltiple basado en esquemas o crear una base de datos separada por arrendatario según la base de datos subyacente con la que se comunique su aplicación.
También publicado en: https://iamradioactive.medium.com/schema-based-multi-tenancy-with-postgres-3438a0403b2e