# DISEÑO DE BASE DE DATOS - ERP GENÉRICO **Fecha:** 2025-11-24 **DBMS:** PostgreSQL 15+ **Patrón:** Multi-Schema + RLS **Total Schemas:** 9 schemas --- ## Arquitectura Multi-Schema Basado en ADR-007 y patrón Gamilit (9 schemas). ### Schemas del ERP Genérico | Schema | Propósito | Módulos | Tablas Estimadas | |--------|-----------|---------|------------------| | `auth` | Autenticación y autorización | MGN-001 | 8 | | `core` | Datos maestros | MGN-002, MGN-003 | 12 | | `financial` | Contabilidad | MGN-004 | 15 | | `inventory` | Inventario | MGN-005 | 10 | | `purchase` | Compras | MGN-006 | 8 | | `sales` | Ventas | MGN-007 | 10 | | `analytics` | Contabilidad analítica | MGN-008 | 6 | | `projects` | Proyectos | MGN-011 | 8 | | `system` | Sistema (logs, notifications) | MGN-012, MGN-014 | 8 | **Total Tablas:** ~85 tablas --- ## Convenciones de Nomenclatura ### Tablas - snake_case - Plural (ej: `users`, `purchase_orders`) - Prefijo de schema en queries (`auth.users`) ### Campos - snake_case - Sufijos estándar: - `_id`: Foreign key - `_at`: Timestamp - `_by`: Usuario (creador, modificador) ### Constraints - PK: `pk_{table}` - FK: `fk_{table}_{referenced_table}` - UNIQUE: `uq_{table}_{columns}` - CHECK: `chk_{table}_{condition}` --- ## Patrones Estándar ### 1. Campos Obligatorios en TODA Tabla ```sql CREATE TABLE schema.table_name ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), tenant_id UUID NOT NULL REFERENCES auth.tenants(id), -- Auditoría created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, created_by UUID REFERENCES auth.users(id), updated_at TIMESTAMP, updated_by UUID REFERENCES auth.users(id), -- Soft delete deleted_at TIMESTAMP, deleted_by UUID REFERENCES auth.users(id), -- ... campos específicos ); ``` ### 2. RLS Policy Estándar ```sql -- Habilitar RLS ALTER TABLE schema.table_name ENABLE ROW LEVEL SECURITY; -- Policy: Solo ver datos de su tenant CREATE POLICY tenant_isolation_policy ON schema.table_name USING (tenant_id = current_setting('app.current_tenant_id')::UUID); ``` ### 3. Índices Estándar ```sql -- Índice en tenant_id (SIEMPRE) CREATE INDEX idx_{table}_tenant_id ON schema.table_name(tenant_id); -- Índice en created_at (para queries ordenadas) CREATE INDEX idx_{table}_created_at ON schema.table_name(created_at); -- Índice compuesto para soft delete CREATE INDEX idx_{table}_active ON schema.table_name(tenant_id, id) WHERE deleted_at IS NULL; ``` --- ## Funciones de Contexto ```sql -- Obtener tenant actual CREATE FUNCTION get_current_tenant_id() RETURNS UUID AS $$ BEGIN RETURN current_setting('app.current_tenant_id', true)::UUID; END; $$ LANGUAGE plpgsql STABLE; -- Obtener usuario actual CREATE FUNCTION get_current_user_id() RETURNS UUID AS $$ BEGIN RETURN current_setting('app.current_user_id', true)::UUID; END; $$ LANGUAGE plpgsql STABLE; ``` --- ## Estructura de Directorio ``` database-design/ ├── README.md (este archivo) ├── database-roadmap.md ├── schemas/ │ ├── auth-schema-ddl.sql (✅ Completado) │ ├── core-schema-ddl.sql (⏳ Pendiente) │ ├── financial-schema-ddl.sql (⏳ Pendiente) │ ├── inventory-schema-ddl.sql (⏳ Pendiente) │ ├── purchase-schema-ddl.sql (⏳ Pendiente) │ ├── sales-schema-ddl.sql (⏳ Pendiente) │ ├── analytics-schema-ddl.sql (⏳ Pendiente) │ ├── projects-schema-ddl.sql (⏳ Pendiente) │ └── system-schema-ddl.sql (⏳ Pendiente) ├── migrations/ │ └── (migrations Prisma o TypeORM) └── seeds/ └── (datos iniciales por schema) ``` --- ## Estrategia de Migración ### Herramienta: Prisma ORM **Razón:** Basado en ADR-001 (Stack Tecnológico) ### Workflow: 1. **Schema DDL Manual:** - Crear DDL completo por schema (auth, core, etc.) - Documentar funciones, triggers, RLS 2. **Prisma Schema:** - Generar schema.prisma desde DDL - O viceversa: generar DDL desde schema.prisma 3. **Migrations:** - `prisma migrate dev` para desarrollo - `prisma migrate deploy` para producción 4. **Seeds:** - Scripts de seed por schema - Datos iniciales: tenants, roles, permissions, currencies --- ## Orden de Implementación Basado en dependencias entre schemas: 1. **auth** (CRÍTICO - sin dependencias) - Tenants, Users, Roles, Permissions 2. **core** (datos maestros) - Companies, Partners, Currencies, Countries, UoM 3. **Schemas transaccionales** (en paralelo) - financial - inventory - purchase - sales 4. **Schemas complementarios** - analytics (depende de transaccionales) - projects (depende de core + analytics) - system (depende de todos) --- ## Próximos Pasos 1. ✅ Crear DDL completo para schema `auth` (COMPLETADO) 2. ⏳ Crear DDL para schema `core` (datos maestros) 3. ⏳ Crear DDL para schemas transaccionales 4. ⏳ Generar Prisma schema desde DDL 5. ⏳ Crear migrations iniciales 6. ⏳ Crear scripts de seed **Ver:** `schemas/` para DDL detallados por schema **Ver:** `database-roadmap.md` para plan completo --- ## Referencias - [ADR-001: Stack Tecnológico](../../adr/ADR-001-stack-tecnologico.md) - [ADR-003: Multi-Tenancy](../../adr/ADR-003-multi-tenancy.md) - [ADR-007: Database Design](../../adr/ADR-007-database-design.md) - [Modelos de Dominio](../domain-models/)