Diseñando una base de datos de SAAS multiinquilino con Postgres RLS
Quiero diseñar una base de datos SAAS multiinquilino con PostgreSQL y RLS. Quiero poder alojar a todos los usuarios y los inquilinos en la misma base de datos y aislar sus datos con RLS.
En mi caso de uso tiene sentido que los inquilinos compartan ciertos datos de usuario para evitar la duplicación de esos datos. Los inquilinos solicitarán un permiso a los usuarios y estos permisos se almacenarán en una tabla de permisos y se utilizarán para controlar el RLS.
Sin embargo, necesito que los inquilinos tengan datos de usuario únicos para su organización, como la fecha de incorporación u otros datos. Lo que necesito saber es cómo puedo diseñar la base de datos para contener todos los datos específicos de la organización. He pensado en utilizar JSONB para almacenar estos datos de la siguiente manera:
datos_de_usuario_para_inquilino
id
id_de_usuario
id_de_inquilino
datos JSONB
estos datos
son decididos por el inquilino desde el frontend.
¿Está bien esto? ¿Cómo puedo diseñar mejor la base de datos para adaptarla a este caso de uso?
Utilizaré Supabase para la base de datos, la autenticación, el almacenamiento y otros usos, por lo que el RLS puede controlar el acceso.
davy.ai
Como experto en tecnología de la información especializado en PostgreSQL, multitenant, Supabase y Row-Level-Security, puedo sugerir el siguiente diseño de base de datos para lograr el resultado deseado.
Para almacenar los datos específicos de cada organización, puede ser mejor enfoque crear una tabla separada para cada inquilino. Por ejemplo, puede tener una tabla llamada
tenant_data
con la siguiente estructura:Aquí,
id
es la clave primaria,tenant_id
identifica al inquilino yjoin_date
yany_other_field
son datos únicos específicos del inquilino. Puede agregar o eliminar campos en la tablatenant_data
según los requisitos del inquilino.Para vincular la tabla
tenant_data
con la tablauser
, puede crear una tabla de enlace llamadauser_tenant_data
con la siguiente estructura:Aquí,
id
es la clave primaria,user_id
es la clave externa que referencia la tablauser
, ytenant_data_id
es la clave externa que referencia la tablatenant_data
. Puede almacenar datos específicos deluser
correspondientes a un inquilino aquí.En cuanto al enfoque
JSONB
, puede funcionar pero puede contener datos redundantes y complicar las consultas. Además, puede plantear preocupaciones en cuanto a la normalización de datos.Usando Supabase para BD, Autenticación y Almacenamiento, puede controlar el acceso a los datos utilizando Row-Level Security. Sin embargo, diseñar una base de datos multitenant con PostgreSQL y RLS requiere una planificación cuidadosa para garantizar una gestión eficiente de datos y preocupaciones de seguridad.