# 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)
