Présentation de Postgres

Postgres est un système de gestion de base de données relationnelles qui nécessite une configuration et une optimisation soigneuses pour fonctionner de manière efficace, en particulier dans les environnements de startup où les ressources sont limitées.

Conception de schémas de base de données

La conception d'un schéma de base de données est cruciale pour assurer des performances optimales. Il est recommandé de construire le schéma de manière itérative, en commençant par une approximation grossière des tables et des clés primaires, puis en écrivant des requêtes basées sur les besoins de l'application.

Les règles de base pour les schémas incluent l'utilisation de colonnes d'identité (auto-incrementales), de timestamps avec fuseau horaire et de clés primaires. Les clés étrangères avec suppression en cascade sont également recommandées pour les tables à faible volume.

Requêtes de lecture et d'écriture performantes

Pour les requêtes de lecture, il est essentiel de comprendre comment Postgres utilise les index. Les index par défaut utilisent une implémentation btree, ce qui permet des recherches rapides en temps logarithmique. Lorsque Postgres ne peut pas utiliser un index, il effectue une analyse séquentielle, qui est beaucoup plus lente.

Pour les requêtes d'écriture, il est important de garder les transactions courtes et de verrouiller uniquement les lignes nécessaires. La création d'index sur des tables existantes doit être effectuée avec la commande CREATE INDEX CONCURRENTLY pour éviter les verrous sur la table.

Gestion des connexions et des migrations

La gestion des connexions est cruciale pour éviter les tempêtes de connexions, qui peuvent entraîner des problèmes de débogage difficiles. Les connexions doivent être longues pour minimiser les ressources gaspillées.

Les migrations doivent être conçues pour être additives et exécutées dans des transactions lorsque possible. Les opérations qui modifient des tables, comme l'ajout de contraintes, doivent être examinées attentivement pour éviter les blocages des écritures.

CREATE INDEX CONCURRENTLY idx_name ON table_name (column_name);