erp-core/docs/97-adr/ADR-003-multi-tenancy.md

70 lines
1.6 KiB
Markdown

# ADR-003: Multi-Tenancy Schema-Level
**Estado:** Aceptada
**Fecha:** 2025-11-23
**Responsable:** Architecture-Analyst
## Contexto
El ERP Genérico debe soportar múltiples empresas/tenants con:
- Aislamiento de datos seguro
- Performance óptimo
- Escalabilidad
## Decisión
**Schema-Level Isolation:** Cada tenant tiene su propio schema PostgreSQL.
```sql
-- Tenant 1
CREATE SCHEMA tenant_abc;
-- Tenant 2
CREATE SCHEMA tenant_xyz;
```
## Justificación
### 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 más seguro y performante
## Consecuencias
### Positivas
- Aislamiento completo (seguridad máxima)
- Backups/restore por tenant
- Migrations por tenant
- Performance (no filtros WHERE company_id)
### Negativas
- Complejidad en gestión de schemas
- Requiere lógica de routing por tenant
## Alternativas Consideradas
**1. Row-Level (column tenant_id)**
- Rechazada: Menor seguridad, queries más lentas
**2. Database por tenant**
- Rechazada: Overhead de conexiones, difícil mantenimiento
## Implementación
### Acciones Requeridas
- [x] Función get_tenant_schema()
- [x] Middleware de routing por tenant
- [x] RLS policies por tenant
### Criterios de Aceptación
- Usuario de tenant A no puede ver datos de tenant B
- Performance igual que single-tenant
## Referencias
- [Gamilit Database Architecture](../00-analisis-referencias/gamilit/database-architecture.md)
- [Odoo Multi-Company](../00-analisis-referencias/odoo/odoo-base-analysis.md)