DDIAを読んで49本のドキュメントを書いた

🐙DDIAを読んで49本のドキュメントを書いた

subaru · ·

DDIAを読んでいた。

読み進めるほど「頭に入れようとすると忘れる、書かないと残らない」という感じがしてきて、気づいたら49本のドキュメントを書いていた。最初は3本くらいのつもりだったが、「ここも整理したい」「この概念と繋がっている」という連鎖が止まらなかった。

8つのテーマに分かれている。


テーマ一覧

#テーマ記事数主な概念
1DDIAの骨格13レプリケーション・トランザクション・分散合意・Kafka
2ストレージ・並行制御4MVCC・列指向・ベクタークロック・CRDT
3クエリ・パフォーマンス4EXPLAIN・キャッシュ・全文検索・N+1
4分散DBの実装4NewSQL・WAL・分散ID・コンシステントハッシング
5運用・信頼性6コネクションプール・マイグレーション・Outbox・PITR
6PostgreSQL専門機能9RLS・ウィンドウ関数・正規化・PostGIS・セキュリティ
7専門型DB3時系列・グラフ・ベクトル
8モダンデータ基盤6dbt・クラウドDB・Lakehouse・データコントラクト

テーマ1: DDIAの骨格(13記事)

DDIAの全12章に対応するコア部分。信頼性・スケーラビリティ・保守性という3軸で始まり、データモデルの違い、ストレージエンジンの仕組み、レプリケーション、シャーディング、トランザクション、分散システムが難しい本当の理由、RaftやZooKeeperによる合意、MapReduce→Spark、Kafkaまで一通り。

ここを飛ばすと後のテーマがぼんやりするので、最初に読む。

こんなエンジニアに: バックエンドを書いているが、DBやインフラの設計判断を人任せにしてきた人。「NoSQLとRDBどちらを使うか」「レプリケーションってどういう仕組みか」を自分の言葉で説明できるようになりたい人。

こんな場面で役立つ: 技術選定の議論、設計レビュー、障害の原因を読むとき。「なぜKafkaを使うのか」「なぜトランザクションが重いのか」の根拠が持てる。


テーマ2: ストレージ・並行制御の深掘り(4記事)

「VACUUMって何してるの」「列指向はなぜ速いの」が気になって掘った。PostgreSQLがどう同時書き込みを捌くか(MVCC)、OLAPでParquetが使われる理由(列指向)、分散システムでイベントの順序をどう決めるか(ベクタークロック)、競合なしに値を合算するCRDT。

こんなエンジニアに: DBの挙動が腑に落ちないことが多いバックエンドエンジニア。データ基盤やDWHを触り始めたアプリ開発者。分散システムの論文を読もうとしている人。

こんな場面で役立つ: 「なぜ SELECT FOR UPDATE が必要なのか」「BigQueryはなぜ集計が速いのか」「オフライン編集の競合をどう解決するか」に答えるとき。


テーマ3: クエリ・パフォーマンス(4記事)

「インデックス貼ったのに遅い」「ORMが何本クエリ投げているか分からない」という経験から整理したテーマ。EXPLAINの読み方、Redisのキャッシュ戦略の使い分け、ElasticsearchのBM25スコアリング、N+1とDataLoader。

こんなエンジニアに: アプリは動いているがレスポンスが遅いと言われている人。Railsや Prisma を使っているが内部で何が起きているか分からない人。検索機能を実装しようとしている人。

こんな場面で役立つ: パフォーマンス改善の場面で、勘に頼らず原因を特定できる。「Redisを入れれば速くなる」ではなく「どのキャッシュ戦略が合うか」を説明できる。


テーマ4: 分散DBの実装(4記事)

普通のPostgreSQLを超えた領域。SpannerとCockroachDBが実現するグローバル分散トランザクション、WALを使ったCDCとDebezium、分散環境でのID設計(UUID v7・ULID)、コンシステントハッシング。

こんなエンジニアに: マイクロサービスを設計・運用しているエンジニア。グローバル展開や大規模トラフィックを扱うシステムを触る機会がある人。DBをまたぐデータ同期に悩んでいる人。

こんな場面で役立つ: 「DBを複数リージョンに置きたい」「サービス間のデータ整合をどう保つか」「IDの衝突をどう防ぐか」を検討するとき。Debeziumは特に、DBの変更をイベントとして流したいときに出てくる。


テーマ5: 運用・信頼性(6記事)

壊さずに直すための技術。PgBouncer、無停止でスキーマを変えるExpand-Contract、マイクロサービス間の結果整合性を保つOutboxパターン、pgBackRestによるPITR、Circuit Breaker、GDPRへの技術的対応。

こんなエンジニアに: 本番環境のマイグレーションが怖い人。「障害時にどこまで戻せるか」を説明できない人。サービス間連携で「片方が落ちたときどうなるか」が不安な人。

こんな場面で役立つ: リリース計画・インフラ設計・障害対応。特にマイグレーションの設計と障害時のリカバリ手順を立てるときに使える知識が詰まっている。


テーマ6: PostgreSQL専門機能(9記事)

PostgreSQLをちゃんと使い倒したくて書いたテーマ。Row Level Security、ウィンドウ関数、正規化理論(1NF〜BCNF)、PostGIS、DBアンチパターン(EAV)、pg_stat_statementsによる診断など。

こんなエンジニアに: PostgreSQLをメインDBとして使っているバックエンドエンジニア。SaaSを作っていてマルチテナント設計に悩んでいる人。テーブル設計を「なんとなく」やってきた人。

こんな場面で役立つ: テーブル設計レビュー、マルチテナントのアクセス制御設計、集計クエリの実装、位置情報機能の追加。「EAVで設計した過去の負債を整理したい」というときにも。


テーマ7: 専門型DB(3記事)

RDBやNoSQLとは別の文脈で設計された専用エンジン。TimescaleDB(時系列)、Neo4j(グラフ)、pgvectorとHNSW(ベクトル)。最後のはRAGを自前で作るときに必要になる。

こんなエンジニアに: IoT・センサーデータ・監視メトリクスを扱う人(時系列)。SNSや推薦システム、ナレッジグラフを作っている人(グラフ)。LLMを使ったアプリでセマンティック検索を実装したい人(ベクトル)。

こんな場面で役立つ: 「PostgreSQLで時系列データを入れたら重くなった」「ユーザー間のつながりをSQLで辿ると遅い」「ChatGPTに自社ドキュメントを読ませたい」という場面でどのエンジンを選ぶかの判断に使える。


テーマ8: モダンデータ基盤(6記事)

2020年代のデータスタック。dbtによるELT、Aurora/Neon/PlanetScaleのクラウドDB比較、Apache IcebergのLakehouse、データコントラクト、OpenTelemetryでのDBクエリトレース。

こんなエンジニアに: データエンジニアリングに関わり始めたバックエンドエンジニア。クラウドDBを選定する立場にある人。「スロークエリがどのAPIリクエストで起きているか分からない」という人。

こんな場面で役立つ: DBサービスの選定、データパイプラインの設計、可観測性の改善。特にOpenTelemetryはアプリのトレースとDBのクエリを紐付けるので、「N+1がどこで起きているか」をトレースビューで特定できるようになる。


全49記事

テーマ記事
DDIAの骨格概観 / データモデル / ストレージ・インデックス / レプリケーション / パーティショニング / トランザクション / 分散システムの困難 / 一貫性と合意 / バッチ処理 / ストリーム処理 / エンコーディング / Saga / 統合設計
ストレージ・並行制御MVCC / 列指向 / ベクタークロック / CRDT
クエリ・パフォーマンスクエリオプティマイザー / キャッシュ戦略 / 全文検索 / N+1問題
分散DBの実装NewSQL / WALとCDC / 分散ID / コンシステントハッシング
運用・信頼性コネクションプール / 無停止マイグレーション / Outboxパターン / バックアップ・PITR / Circuit Breaker / Crypto-Shredding
PostgreSQL専門機能RLS / DBアンチパターン / マテリアライズドビュー / DBモニタリング / 垂直パーティショニング / ウィンドウ関数 / 正規化理論 / PostGIS / DBセキュリティ
専門型DB時系列DB / グラフDB / ベクトルDB
モダンデータ基盤dbt / ジョブキュー / クラウドDB / Lakehouse / データコントラクト / OpenTelemetry