Overview
SociApp uses MySQL as the relational database, with TypeORM as the Object-Relational Mapper (ORM). The database stores users, projects, activities, donations, and bank information.Database Configuration
Connection Setup
Database connection is configured insrc/app.module.ts using TypeORM:
Environment Variables
MySQL Version
- Driver: mysql2 ^3.16.3
- Recommended MySQL Version: 8.0+
- Character Set: utf8mb4
- Collation: utf8mb4_unicode_ci
Entity Definitions
Users Entity (Usuarios)
Location:src/users/user.entity.ts
Users Table Schema
Users Fields Description
| Field | Type | Description |
|---|---|---|
| IdUsuario | INT | Primary key, auto-increment |
| nombre | VARCHAR | User’s first name |
| apellidos | VARCHAR | User’s last name |
| password | VARCHAR | Bcrypt hashed password (12 rounds) |
| dni | VARCHAR | National ID number |
| direccion | VARCHAR | Street address |
| CP | VARCHAR | Postal code |
| provincia | VARCHAR | Province/state |
| poblacion | VARCHAR | City/town |
| pais | VARCHAR | Country |
| VARCHAR | Email address (unique) | |
| telefono | VARCHAR | Phone number |
| fechaalta | DATE | Registration date |
| fechabaja | DATE | Deactivation date (nullable) |
| formadepago | VARCHAR | Payment method |
| cuota | DECIMAL | Membership fee amount |
| categoria | VARCHAR | User role (monitor, admin, socio) |
| socio | ENUM | Member status |
| isVerified | BOOLEAN | Email verification status |
| verificationCode | VARCHAR(10) | 6-digit verification code |
| verificationExpires | TIMESTAMP | Code expiration timestamp |
Projects Entity (Proyectos)
Location:src/projects/project.entity.ts
Projects Table Schema
Activities Entity (Actividades)
Location:src/activities/activity.entity.ts
Activities Table Schema
Donations Entity (Donativo)
Location:src/donativos/donativo.entity.ts
Banks Entity (Banco)
Location:src/bancos/banco.entity.ts
Database Relationships
Entity Relationship Diagram
Relationship Details
Usuarios → Proyectos (One-to-Many)
- Relationship: A user can be responsible for multiple projects
- Foreign Key:
Responsableinproyectostable - TypeORM:
@ManyToOne(() => Usuarios) - On Delete: SET NULL (projects remain if user deleted)
Usuarios → Actividades (One-to-Many)
- Relationship: A user (monitor) can supervise multiple activities
- Foreign Key:
idMonitorinactividadestable - TypeORM:
@ManyToOne(() => Usuarios) - On Delete: SET NULL (activities remain if monitor deleted)
Proyectos → Actividades (One-to-Many)
- Relationship: Projects can contain multiple activities
- Storage:
actividadescolumn stores activity IDs as simple array - TypeORM:
@OneToMany(() => Activity, ...)
TypeORM Features Used
Column Types
Nullable Columns
Default Values
Custom Column Names
Repository Pattern
Injecting Repositories
Common Repository Methods
Migration Strategy
Current Approach
synchronize: false means TypeORM will NOT automatically modify the database schema. This prevents accidental data loss.
Manual Migration Workflow
1. Generate Migration
2. Create Empty Migration
3. Run Migrations
4. Revert Migration
Example Migration File
Database Indexes
Recommended Indexes
Query Optimization Tips
-
Use Relations Wisely: Only load relations when needed
-
Select Specific Columns: Don’t load unnecessary data
-
Use Pagination: For large datasets
- Cache Frequent Queries: Use NestJS cache module
