68 lines
1.7 KiB
Markdown
68 lines
1.7 KiB
Markdown
# ADR-005 : Base de Données
|
|
|
|
**Statut** : Accepté
|
|
**Date** : 2025-01-17
|
|
|
|
## Contexte
|
|
|
|
Requêtes géolocalisées intensives (contenus à proximité), données utilisateurs, historiques d'écoute.
|
|
|
|
## Décision
|
|
|
|
- **PostgreSQL + PostGIS** : Données persistantes et requêtes géospatiales
|
|
- **Redis Cluster** : Cache géolocalisation et sessions
|
|
|
|
## Architecture
|
|
|
|
```
|
|
Requête → Redis Cache → [HIT] → Réponse
|
|
↓
|
|
[MISS]
|
|
↓
|
|
PostGIS → Cache → Réponse
|
|
```
|
|
|
|
## Alternatives considérées
|
|
|
|
| Usage | Option choisie | Alternatives |
|
|
|-------|---------------|--------------|
|
|
| Données utilisateurs | PostgreSQL | MySQL, MongoDB |
|
|
| Géolocalisation | PostGIS | MongoDB Geo, Elasticsearch |
|
|
| Cache | Redis | Memcached, KeyDB |
|
|
| Analytics (futur) | ClickHouse | TimescaleDB |
|
|
|
|
## Justification
|
|
|
|
### PostgreSQL + PostGIS
|
|
- Requêtes géospatiales complexes et précises
|
|
- Index GIST pour performance
|
|
- ACID, fiabilité éprouvée
|
|
- Écosystème mature
|
|
|
|
### Redis
|
|
- Cache géo natif (`GEORADIUS`) : 100K+ requêtes/sec
|
|
- Sessions utilisateurs
|
|
- Pub/sub pour temps réel
|
|
|
|
## Exemple de requête
|
|
|
|
```sql
|
|
SELECT id, name,
|
|
ST_Distance(location::geography, ST_MakePoint($lon, $lat)::geography) as distance
|
|
FROM contents
|
|
WHERE ST_DWithin(location::geography, ST_MakePoint($lon, $lat)::geography, 50000)
|
|
ORDER BY distance
|
|
LIMIT 20;
|
|
```
|
|
|
|
## Conséquences
|
|
|
|
- TTL cache Redis : 5 minutes (le contenu géolocalisé ne bouge pas)
|
|
- Index GIST sur colonnes géométriques
|
|
- Réplication read replicas pour scaling lecture
|
|
|
|
## Documentation technique détaillée
|
|
|
|
- [Diagramme de séquence cache géospatial](../architecture/sequences/cache-geospatial.md)
|
|
- [Schéma base de données](../architecture/database/schema.md)
|