Mis notas sobre el diseño del esquema Postgres de GitLab (2022)
(shekhargulati.com)Mis notas sobre el diseño del esquema Postgres de GitLab
- Al revisar el esquema de Postgres de GitLab, quería compararlo con el que diseño yo y aprender buenas prácticas a partir de su definición de esquema.
- GitLab es una plataforma DevOps de código abierto, una alternativa a GitHub, y se puede autoalojar.
Usar el tipo correcto de clave primaria
- Cuando la base de datos es pequeña esto no se nota, pero a medida que crece la clave primaria impacta en el espacio de almacenamiento, la velocidad de escritura y la velocidad de lectura.
- GitLab usa
bigserialcomo tipo de clave primaria en 380 de sus 573 tablas,serial4en 170 y claves primarias compuestas en las 23 restantes.
Uso de IDs internos y externos
- Es una buena práctica no exponer la clave primaria al mundo exterior.
- GitLab usa tanto ID interno (
id) como ID externo (iid) en tablas comoissues,ci_pipelines,deploymentsyepics.
Usar el tipo text y restricciones de validación
- El esquema de GitLab usa tanto
character varying(n)comotext, pero utiliza más frecuentementetext. textno tiene una restricción de longitud, y define las restricciones de longitud conCHECK.
Convenciones de nomenclatura
- Todas las tablas usan plural y utilizan el prefijo del nombre del módulo para proporcionar un namespace.
- Los nombres de tablas y columnas siguen el formato
snake_case.
Uso de zonas horarias en timestamps
- GitLab usa tanto
timestamp with timezonecomotimestamp without timezone. - Utiliza
timestamp without timezonepara operaciones del sistema ytimestamp with timezonepara acciones de usuario.
Restricciones de clave foránea
- GitLab usa restricciones de clave foránea en la mayoría de las tablas, aunque hay algunas en las que no las usa, como
audit_events,abuse_reports,web_hooks_logsyspam_logs.
Particionamiento de tablas grandes
- GitLab particiona tablas que podrían crecer para mejorar el rendimiento de las consultas.
Soportar búsquedas LIKE con trigrams y gin_trgm_ops
- GitLab usa índices
GIN(Generalized Inverted Index) para realizar búsquedas de forma eficiente.
Uso de jsonb
- El esquema de GitLab usa el tipo de dato
jsonben varias tablas.
Otros consejos
- Usa campos de auditoría como
updated_aten tablas que pueden modificarse y no los usa en tablas de logs que no se pueden modificar. - Los enums se guardan como
smallinten lugar decharacter varying, lo que ahorra espacio.
Opinión de GN⁺:
- El diseño del esquema de GitLab ofrece ideas de diseño de base de datos y contiene lecciones importantes para la optimización de esquemas en sistemas de gran escala.
- Como GitLab es de código abierto, estas decisiones de diseño de esquema ofrecen ejemplos prácticos que otros desarrolladores pueden aplicar en sus propios proyectos.
- Lo que se puede aprender del esquema de GitLab es que elementos como la selección del tipo de dato, la estrategia de indexación, el particionamiento y el uso de restricciones de clave foránea impactan de forma importante en el rendimiento y mantenimiento de la base de datos.
1 comentarios
Opiniones de Hacker News
Iextra que aparece en variables de CI y concluye que se trata de una decisión relacionada con la base de datos.