Database Architecture
Sistema de Ventas uses a database-per-service pattern, where each microservice has its own isolated database schema. This approach provides:- Data Independence: Services own their data
- Technology Diversity: Mix of MySQL and PostgreSQL
- Independent Scaling: Scale databases independently
- Loose Coupling: No direct database dependencies between services
Database Distribution
MySQL Databases (6)
auth-jea(Authentication)catalogo-ms(Products & Categories)venta-jea(Sales)compra-jea(Purchases)pedido-jea(Orders)pagos-ms(Payment Methods)
PostgreSQL Databases (2)
cliente-jea(Customers)proveedor-jea(Suppliers)
Database Initialization
SQL Scripts
The system includes initialization scripts insql-scripts/:
01-init-databases.sql
Creates all required databases:Note the database naming convention:
- Config files use:
auth-jea,catalogo-ms,venta-jea, etc. - Init script uses:
jeaauth,jeacatalogo,jeaventa, etc.
02-datos-ejemplo.sql
Populates databases with sample data: Proveedores (Suppliers)03-verificar-datos.sql
Verifies data insertion:Schema Management
JPA Auto-DDL
All services use JPA’s automatic schema generation:update: Updates schema without dropping datacreate: Drops and recreates schema on startupcreate-drop: Creates schema, drops on shutdownvalidate: Validates schema without changesnone: No automatic schema management
Database Connections
- MySQL Configuration
- PostgreSQL Configuration
Database Schemas by Service
Auth Database (auth-jea)
Tables:
auth_user: Authentication credentialsusuario: User profile informationrol: User rolesacceso: Permissions/Access rightsusuario_rol: User-Role mapping (Many-to-Many)acceso_rol: Role-Access mapping (Many-to-Many)
Catalogo Database (catalogo-ms)
Tables:
categoria: Product categoriesproducto: Products with inventory
- Unique product codes and names
- Automatic timestamp management
- Default quantity: 0
- Image storage path reference
Cliente Database (cliente-jea)
Tables:
cliente: Customer information
dni(Document ID)email
activo: truefecha_registro: Current timestamp
Venta Database (venta-jea)
Tables:
venta: Sales headerventa_detalle: Sales line items
cliente_id→ Cliente Serviceproducto_id→ Catalogo Serviceformapago_id→ Pagos Service
serie(3 letters, auto-generated)numero(6 digits, auto-generated)
base_imponible: Price / 1.18igv: Price - base_imponible (18% tax)total: Sum of all line items
Compra Database (compra-jea)
Tables:
compra: Purchase headercompra_detalle: Purchase line items
proveedor_id→ Proveedor Serviceproducto_id→ Catalogo Serviceformapago_id→ Pagos Service
- Auto-generated serie and numero
- Tax calculations (18% IGV)
- Automatic totals calculation
Pedido Database (pedido-jea)
Tables:
pedido: Order headerpedido_detalle: Order line items
cliente_id→ Cliente Serviceproducto_id→ Catalogo Serviceformapago_id→ Pagos Service
estado: Order status (PENDIENTE, EN_PROCESO, COMPLETADO)fecha_entrega: Delivery date (default: +7 days)codigo: Order codeserie: Order series
Pagos Database (pagos-ms)
Tables:
forma_pago: Payment methods catalog
id: Auto-incrementnombre: Payment method name
Proveedor Database (proveedor-jea)
Tables:
proveedor: Supplier information
ruc: Tax ID (unique)nombre: Company nametelefono: Phone numberdireccion: Addresscorreo: Emailestado: Active status (default: true)
Cross-Service Data References
Transient Fields Pattern
Services use@Transient fields to hold data from other services:
Data Consistency
Data Flow Example: Creating a Sale
Database Deployment
Docker Compose Example
Environment-Specific Configuration
- Development
- Production
- Use localhost connections
- Empty or simple passwords
show-sql: truefor debuggingddl-auto: update
Data Migration Strategy
Current Approach
- JPA auto-generates schemas from entity classes
- Manual SQL scripts for initial data
- No version-controlled migrations
Recommended for Production
Flyway Configuration Example
Database Monitoring
JPA Statistics
Enable Hibernate statistics for monitoring:Connection Pool Monitoring
Configure HikariCP (default pool):Actuator Endpoints
Monitor database health:/actuator/health/db/actuator/metrics/hikaricp.*/actuator/metrics/jdbc.*
Backup and Recovery
MySQL Backup
PostgreSQL Backup
Automated Backup Strategy
- Daily automated backups
- Retention policy (e.g., 30 days)
- Off-site backup storage
- Regular restore testing
- Point-in-time recovery capability
Performance Considerations
Indexing
Automatic Indexes (via JPA):- Primary keys (
@Id) - Unique constraints (
unique = true) - Foreign keys (
@ManyToOne,@OneToOne)
Query Optimization
- Use pagination for large result sets
- Implement caching for reference data (categories, payment methods)
- Use lazy loading judiciously
- Consider read replicas for reporting
Database Scaling
Vertical Scaling
- Increase database server resources
- Optimize queries and indexes
- Connection pool tuning
Horizontal Scaling
- Read replicas for queries
- Sharding by service
- Cache layer (Redis)
Next Steps
Data Models
Explore entity relationships and domain models
Microservices
Review microservice implementations