Mes notes sur la conception du schéma Postgres de GitLab (2022)
(shekhargulati.com)Mes notes sur la conception du schéma Postgres de GitLab
- En étudiant le schéma Postgres de GitLab, je voulais le comparer au schéma que je conçois et apprendre de bonnes pratiques à partir des définitions de schéma de GitLab.
- GitLab est une plateforme DevOps open source, alternative à GitHub et pouvant être auto-hébergée.
Utiliser le bon type de clé primaire
- Quand la base de données est petite, on ne le remarque pas, mais à mesure qu’elle grandit, la clé primaire impacte l’espace de stockage, la vitesse d’écriture et la vitesse de lecture.
- GitLab utilise
bigserialcomme type de clé primaire pour 380 des 573 tables,serial4pour 170, et des clés primaires composites pour les 23 restantes.
Utiliser des IDs internes et externes
- Il est recommandé de ne pas exposer la clé primaire au monde extérieur.
- GitLab utilise à la fois l’ID interne (
id) et l’ID externe (iid) dans des tables commeissues,ci_pipelines,deploymentsetepics.
Utiliser le type texte text avec des contraintes CHECK
- Le schéma de GitLab utilise à la fois
character varying(n)ettext, mais emploie plus souvent le typetext. - Le type
textn’impose pas de contrainte de longueur, et GitLab utiliseCHECKpour définir la contrainte de longueur.
Conventions de nommage
- Toutes les tables sont au pluriel et utilisent un préfixe de nom de module pour fournir un espace de noms.
- Les noms des tables et des colonnes suivent la convention
snake_case.
Gestion des fuseaux horaires des timestamps
- GitLab utilise à la fois
timestamp with timezoneettimestamp without timezone. - Les opérations système utilisent
timestamp without timezone, tandis que les actions utilisateur utilisenttimestamp with timezone.
Contraintes de clé étrangère
- GitLab applique des contraintes de clé étrangère sur la plupart des tables, mais pas sur certaines, comme
audit_events,abuse_reports,web_hooks_logsetspam_logs.
Partitionnement des grandes tables
- GitLab partitionne les tables qui peuvent devenir volumineuses afin d’améliorer les performances des requêtes.
Prise en charge des cas d’usage de recherche LIKE avec les trigrammes et gin_trgm_ops
- GitLab utilise des index GIN (Generalized Inverted Index) pour effectuer des recherches efficaces.
Utiliser jsonb
- Le schéma de GitLab utilise le type de données
jsonbdans plusieurs tables.
Autres conseils
- Les tables modifiables utilisent des champs d’audit comme
updated_at, tandis que les tables de logs immuables ne l’utilisent pas. - Les enums sont stockées en
smallintau lieu decharacter varyingpour économiser de l’espace.
GN⁺ :
- La conception du schéma de GitLab apporte des enseignements utiles pour la conception de base de données, notamment des leçons clés sur l’optimisation de schéma pour les systèmes à grande échelle.
- Comme GitLab est open source, ces décisions de conception de schéma fournissent des exemples pratiques que d’autres développeurs peuvent appliquer à leurs propres projets.
- Les points importants à retenir du schéma de GitLab sont qu’il faut considérer attentivement des éléments qui affectent fortement les performances et la maintenance de la base de données, comme le choix des types de données, la stratégie d’indexation, le partitionnement et l’usage des contraintes de clés étrangères.
1 commentaires
Commentaires Hacker News
serialet mentionne le coût élevé d’un changement de type de table.UUIDv4est totalement aléatoire et donc peu adapté aux performances des index, et indique queUUIDv7peut être une meilleure solution.Isupplémentaire visible dans les variables CI et comprend qu’il s’agit d’un choix lié à la base de données.UUIDv4etbigserial, et demande pourquoiUUIDv4donne de moins bonnes performances.