GitLabのPostgresスキーマ設計に関する私のメモ (2022)
(shekhargulati.com)GitLabのPostgresスキーマ設計に関する私のメモ
- GitLabのPostgresスキーマを調べることで、独自に設計するスキーマと比較し、GitLabのスキーマ定義からベストプラクティスを学び取ることを目的とした。
- GitLabはオープンソースのDevOpsプラットフォームで、GitHubの代替として、自社でホスト可能。
適切な主キー型の選択
- データベースが小さいうちは目立たないが、成長するにつれて主キーはストレージ容量、書き込み速度、読み取り速度に影響を与える。
- GitLabでは、573のテーブルのうち380が
bigserialの主キー型、170がserial4を使用し、残り23が複合主キーを使用している。
内部IDと外部IDの利用
- 主キーを外部世界に公開しないことはよいプラクティスである。
- GitLabは、
issues、ci_pipelines、deployments、epicsなどのテーブルで、内部ID(id)と外部ID(iid)の両方を使用している。
text型とCHECK制約の使用
- 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はクエリのパフォーマンス向上のため、サイズが拡大しうるテーブルをパーティション分割する。
Trigramとgin_trgm_opsを使用したLIKE検索ユースケースのサポート
- GitLabはGIN(Generalized Inverted Index)インデックスを使用して効率的な検索を実行している。
jsonbの使用
- GitLabのスキーマでは複数のテーブルで
jsonbデータ型を使用している。
その他のヒント
- 更新可能なテーブルには
updated_atのような監査フィールドを使用し、更新不可能なログテーブルでは使用しない。 - Enumsは
character varyingの代わりにsmallintで保存され、スペースを節約している。
GN⁺の意見:
- GitLabのスキーマ設計はデータベース設計に対する洞察を提供し、特に大規模システム向けのスキーマ最適化に関する重要な教訓を含んでいる。
- GitLabがオープンソースであるため、このようなスキーマ設計の意思決定は、他の開発者が自分のプロジェクトに適用できる実践的な例を提供する。
- GitLabのスキーマから学べることは、データ型の選択、インデックス戦略、パーティショニング、外部キー制約の使用など、データベースの性能と保守性に大きな影響を与える要素を慎重に考慮することが必要だという点だ。
1件のコメント
Hacker Newsの意見