GitLab Postgres 스키마 디자인에 대한 나의 노트
- GitLab의 Postgres 스키마를 살펴봄으로써, 자신이 설계하는 스키마와 비교하고, GitLab의 스키마 정의에서 모범 사례를 배우고자 함.
- GitLab은 오픈 소스 DevOps 플랫폼으로, GitHub의 대안이며 자체 호스팅이 가능함.
올바른 기본 키 유형 사용하기
- 데이터베이스가 작을 때는 눈에 띄지 않지만, 성장함에 따라 기본 키가 저장 공간, 쓰기 속도, 읽기 속도에 영향을 미침.
- GitLab은 573개의 테이블 중 380개는
bigserial기본 키 유형을, 170개는serial4를 사용하고, 나머지 23개는 복합 기본 키를 사용함.
내부 및 외부 ID의 사용
- 기본 키를 외부 세계에 노출하지 않는 것이 좋은 관행임.
- GitLab은
issues,ci_pipelines,deployments,epics등의 테이블에서 내부 ID(id)와 외부 ID(iid)를 모두 사용함.
text 문자 유형과 검사 제약 조건 사용하기
- GitLab 스키마는
character varying(n)과text를 모두 사용하지만,text유형을 더 자주 사용함. text유형은 길이 제약을 가지고 있지 않으며,CHECK를 사용하여 길이 제약을 정의함.
명명 규칙
- 모든 테이블은 복수형을 사용하며, 모듈 이름 접두사를 사용하여 네임스페이스를 제공함.
- 테이블과 열 이름은 snake_case 규칙을 따름.
타임스탬프의 시간대 사용
- GitLab은
timestamp with timezone과timestamp without timezone을 모두 사용함. - 시스템 작업에는
timestamp without timezone을, 사용자 작업에는timestamp with timezone을 사용함.
외래 키 제약 조건
- GitLab은 대부분의 테이블에서 외래 키 제약 조건을 사용하지만,
audit_events,abuse_reports,web_hooks_logs,spam_logs와 같은 몇몇 테이블에서는 사용하지 않음.
큰 테이블의 파티셔닝
- GitLab은 쿼리 성능을 향상시키기 위해 크기가 커질 수 있는 테이블을 파티셔닝함.
Trigrams과 gin_trgm_ops를 사용하여 LIKE 검색 사용 사례 지원하기
- GitLab은 GIN(Generalized Inverted Index) 인덱스를 사용하여 효율적인 검색을 수행함.
jsonb의 사용
- GitLab 스키마는 여러 테이블에서
jsonb데이터 유형을 사용함.
기타 팁
- 수정 가능한 테이블에는
updated_at과 같은 감사 필드를 사용하고, 수정할 수 없는 로그 테이블에는 사용하지 않음. - Enums는
character varying대신smallint로 저장되어 공간을 절약함.
GN⁺의 의견:
- GitLab의 스키마 디자인은 데이터베이스 설계에 대한 통찰력을 제공하며, 특히 대규모 시스템을 위한 스키마 최적화에 대한 중요한 교훈을 담고 있음.
- GitLab이 오픈 소스이기 때문에, 이러한 스키마 설계 결정들은 다른 개발자들이 자신의 프로젝트에 적용할 수 있는 실질적인 예시를 제공함.
- GitLab의 스키마에서 배울 수 있는 점은, 데이터 유형 선택, 인덱싱 전략, 파티셔닝, 외래 키 제약 조건의 사용 등 데이터베이스 성능과 유지 관리에 중요한 영향을 미치는 요소들을 신중하게 고려해야 한다는 것임.