| .. | ||
| schemas | ||
| AUTOMATIC-TRACKING-SYSTEM.md | ||
| database-roadmap.md | ||
| DDL-SPEC-ai_agents.md | ||
| DDL-SPEC-billing.md | ||
| DDL-SPEC-core_auth.md | ||
| DDL-SPEC-core_catalogs.md | ||
| DDL-SPEC-core_rbac.md | ||
| DDL-SPEC-core_tenants.md | ||
| DDL-SPEC-core_users.md | ||
| DDL-SPEC-integrations.md | ||
| DDL-SPEC-messaging.md | ||
| README.md | ||
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
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
-- 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
-- Í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
-- 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:
-
Schema DDL Manual:
- Crear DDL completo por schema (auth, core, etc.)
- Documentar funciones, triggers, RLS
-
Prisma Schema:
- Generar schema.prisma desde DDL
- O viceversa: generar DDL desde schema.prisma
-
Migrations:
prisma migrate devpara desarrolloprisma migrate deploypara producción
-
Seeds:
- Scripts de seed por schema
- Datos iniciales: tenants, roles, permissions, currencies
Orden de Implementación
Basado en dependencias entre schemas:
-
auth (CRÍTICO - sin dependencias)
- Tenants, Users, Roles, Permissions
-
core (datos maestros)
- Companies, Partners, Currencies, Countries, UoM
-
Schemas transaccionales (en paralelo)
- financial
- inventory
- purchase
- sales
-
Schemas complementarios
- analytics (depende de transaccionales)
- projects (depende de core + analytics)
- system (depende de todos)
Próximos Pasos
- ✅ Crear DDL completo para schema
auth(COMPLETADO) - ⏳ Crear DDL para schema
core(datos maestros) - ⏳ Crear DDL para schemas transaccionales
- ⏳ Generar Prisma schema desde DDL
- ⏳ Crear migrations iniciales
- ⏳ Crear scripts de seed
Ver: schemas/ para DDL detallados por schema
Ver: database-roadmap.md para plan completo