# 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)