# ADR-003: Multi-Tenancy Schema-Level **Estado:** Aceptada **Fecha:** 2025-11-24 **Responsable:** Architecture-Analyst **Proyecto:** ERP Construccion ## Contexto El ERP de Construccion debe soportar multiples empresas constructoras/tenants con: - Aislamiento de datos seguro (proyectos, presupuestos, INFONAVIT) - Performance optimo para grandes volumenes de datos - Escalabilidad para multiples desarrollos inmobiliarios - Cumplimiento regulatorio (INFONAVIT requiere aislamiento) ## Decision **Schema-Level Isolation:** Cada tenant (empresa constructora) tiene su propio schema PostgreSQL. ```sql -- Constructora ABC CREATE SCHEMA tenant_constructora_abc; -- Desarrolladora XYZ CREATE SCHEMA tenant_desarrolladora_xyz; ``` ## Justificacion ### Referencia a Gamilit - Gamilit usa multi-schema para separar dominios - Permisos granulares por schema - Backups selectivos por tenant ### Referencia a Odoo - Odoo usa `company_id` en todas las tablas (row-level) - Schema-level es mas seguro y performante para construccion ### Alineacion con ERP Generico - Misma estrategia de multi-tenancy - Migracion de datos sencilla ### Especifico para Construccion - Proyectos INFONAVIT requieren aislamiento total - Cada fraccionamiento puede ser un tenant diferente - Auditorias de INFONAVIT facilitan con backups por tenant ## Consecuencias ### Positivas - Aislamiento completo (seguridad maxima) - Backups/restore por constructora - Migrations por tenant - Performance (no filtros WHERE company_id) - Cumplimiento INFONAVIT ### Negativas - Complejidad en gestion de schemas - Requiere logica de routing por tenant ## Alternativas Consideradas **1. Row-Level (column tenant_id)** - Rechazada: Menor seguridad, no cumple INFONAVIT **2. Database por tenant** - Rechazada: Overhead de conexiones, dificil mantenimiento ## Implementacion ### Acciones Requeridas - [x] Funcion get_tenant_schema() - [x] Middleware de routing por tenant - [x] RLS policies por tenant - [ ] Scripts de creacion de tenant para INFONAVIT ### Criterios de Aceptacion - Usuario de Constructora A no puede ver datos de Constructora B - Performance igual que single-tenant - Auditorias INFONAVIT por tenant funcionales ## Referencias - [ERP Generico ADR-003](../../erp-generic/docs/adr/ADR-003-multi-tenancy.md) - [Gamilit Database Architecture](../../shared/reference/gamilit/database-architecture.md)