70 lines
1.6 KiB
Markdown
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)
|