68 lines
1.4 KiB
Markdown
68 lines
1.4 KiB
Markdown
|
|
# ADR-002: GraphQL vs REST
|
||
|
|
|
||
|
|
**Estado:** Aceptado
|
||
|
|
**Fecha:** 2026-01-07
|
||
|
|
|
||
|
|
## Contexto
|
||
|
|
|
||
|
|
La aplicación tiene relaciones complejas:
|
||
|
|
- Estudiantes → Inscripciones → Materias → Profesores
|
||
|
|
- Consultas como "materias disponibles" requieren múltiples joins
|
||
|
|
- Frontend necesita flexibilidad en datos solicitados
|
||
|
|
|
||
|
|
## Decisión
|
||
|
|
|
||
|
|
Usar **GraphQL** con HotChocolate como API.
|
||
|
|
|
||
|
|
## Consecuencias
|
||
|
|
|
||
|
|
### Positivas
|
||
|
|
- **No over-fetching:** Cliente pide solo campos necesarios
|
||
|
|
- **No under-fetching:** Una query obtiene datos relacionados
|
||
|
|
- **Schema tipado:** Contrato explícito frontend-backend
|
||
|
|
- **Playground incluido:** Banana Cake Pop para testing
|
||
|
|
- **DataLoaders:** Resuelve N+1 automáticamente
|
||
|
|
|
||
|
|
### Negativas
|
||
|
|
- Complejidad adicional vs REST simple
|
||
|
|
- Curva de aprendizaje GraphQL
|
||
|
|
- Requiere configurar query complexity limits
|
||
|
|
- Cache más complejo que HTTP caching
|
||
|
|
|
||
|
|
## Ejemplo Comparativo
|
||
|
|
|
||
|
|
### REST (múltiples requests)
|
||
|
|
```
|
||
|
|
GET /students/1
|
||
|
|
GET /students/1/enrollments
|
||
|
|
GET /subjects/1
|
||
|
|
GET /professors/1
|
||
|
|
```
|
||
|
|
|
||
|
|
### GraphQL (una query)
|
||
|
|
```graphql
|
||
|
|
query {
|
||
|
|
student(id: 1) {
|
||
|
|
name
|
||
|
|
enrollments {
|
||
|
|
subject {
|
||
|
|
name
|
||
|
|
professor { name }
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
## Alternativas
|
||
|
|
|
||
|
|
| Alternativa | Razón de Descarte |
|
||
|
|
|-------------|-------------------|
|
||
|
|
| REST | Over/under-fetching, múltiples endpoints |
|
||
|
|
| OData | Menos flexible, menos ecosistema |
|
||
|
|
| gRPC | No ideal para frontend web |
|
||
|
|
|
||
|
|
## Referencias
|
||
|
|
|
||
|
|
- [HotChocolate Docs](https://chillicream.com/docs/hotchocolate)
|