Minhas anotações sobre o design do schema Postgres do GitLab (2022)
(shekhargulati.com)Minhas notas sobre o design do schema Postgres do GitLab
- Ao analisar o schema Postgres do GitLab, quis comparar com o schema que eu mesmo projeto e aprender boas práticas na definição de schemas do GitLab.
- O GitLab é uma plataforma DevOps de código aberto, uma alternativa ao GitHub e pode ser autohospedado.
Usar os tipos corretos de chave primária
- Em um banco de dados pequeno isso pode não parecer importante, mas conforme ele cresce, a chave primária impacta o espaço de armazenamento, a velocidade de escrita e a velocidade de leitura.
- O GitLab usa
bigserialcomo tipo de chave primária em 380 das 573 tabelas,serial4em 170 e nas 23 restantes usa chaves primárias compostas.
Uso de IDs internos e externos
- É uma boa prática não expor a chave primária ao mundo externo.
- O GitLab usa tanto IDs internos (
id) quanto IDs externos (iid) em tabelas comoissues,ci_pipelines,deploymentseepics.
Uso de text e restrições CHECK para campos de texto
- O schema do GitLab usa tanto
character varying(n)quantotext, mas usa mais frequentemente o tipotext. - O tipo
textnão tem restrição de comprimento, então ele define restrições de tamanho comCHECK.
Convenções de nomenclatura
- Todas as tabelas usam nomes no plural e usam prefixos de módulo para fornecer namespace.
- Os nomes de tabela e coluna seguem o padrão
snake_case.
Uso de fuso horário em timestamps
- O GitLab usa tanto
timestamp with timezonequantotimestamp without timezone. - Para operações do sistema usa
timestamp without timezone, enquanto para ações de usuário usatimestamp with timezone.
Restrições de chave estrangeira
- O GitLab usa restrições de chave estrangeira na maioria das tabelas, mas não as utiliza em algumas tabelas, como
audit_events,abuse_reports,web_hooks_logsespam_logs.
Particionamento de tabelas grandes
- O GitLab particiona tabelas grandes que podem crescer para melhorar o desempenho de consultas.
Como dar suporte a casos de uso de busca com LIKE usando trigramas e gin_trgm_ops
- O GitLab usa índices GIN (Generalized Inverted Index) para realizar buscas de forma eficiente.
Uso de jsonb
- O schema do GitLab usa o tipo de dado
jsonbem várias tabelas.
Dicas extras
- Em tabelas editáveis, ele usa campos de auditoria como
updated_at, enquanto em tabelas de log imutáveis esse campo não é usado. - Enums são armazenados como
smallintem vez decharacter varyingpara economizar espaço.
Opinião do GN⁺:
- O design do schema do GitLab oferece insights sobre design de banco de dados e traz lições importantes sobre otimização de schema para sistemas em larga escala.
- Como o GitLab é open source, essas decisões de design de schema oferecem exemplos práticos que outros desenvolvedores podem aplicar em seus próprios projetos.
- O que podemos aprender com o schema do GitLab é que escolhas de tipo de dado, estratégia de indexação, particionamento e uso de restrições de chave estrangeira precisam ser feitas com cuidado porque impactam significativamente desempenho e manutenção de banco de dados.
1 comentários
Comentário do Hacker News
Iextra nas variáveis de CI e entende que isso confirma uma escolha relacionada ao banco de dados.