📓

第3章:データ構造の話、地味だけどめっちゃ大事

に公開

第3章:データ構造の話、地味だけどめっちゃ大事

『データ指向アプリケーションデザイン(DDIA)』第3章を読んだメモです
地味に見えて、実は設計の基礎体力に直結する「データ構造」の話を、自分の言葉で整理してみました

🔙 目次に戻る


データ構造がわからないとDBの話がわからない

DBまわりの話をするときは、データ構造が根底にないと話についていけない
この辺を抑えておくと、業務や案件に適したデータベースを選べるようになってくるはず


WAL(Write Ahead Log)

ログファイルに書き込むのはPostgresみたいなRDBも同じで、WAL(Write Ahead Log)って言われてる
復元するときもWALから、だいたい何かしらWAL使ってるので超重要

WALの“A”は ahead、忘れがちなので2回言う🙄


メモリに収まるかどうか?

「メモリに収まるか?」はめちゃくちゃ重要
キャッシュ設計でもインデックス設計でも、常に意識しておきたい観点
再起動したら消えるとか、そもそも永続化の設計にも関わってくる


SSTableとバイナリサーチの話

SSTable化でソートされると、バイナリサーチのような検索が可能になるので効率的
単純だけど強い構造


全文検索への応用?

請求書検索とかを考えると、全文検索も活用できそう

  • 検索対象を単語で分解してキーにする
  • UUIDをバリューにしたKVストアを構築するイメージ

実際のキーワード傾向を分析すれば、何をキーにすべきかのヒントが得られそう


ブルームフィルタ

「存在しないことを効率よく判定する」=ブルームフィルタの出番

設計系の本や様々な記事でもよく紹介されている
検索が増えてくると導入余地が出てくる気がする


Bツリー

  • 固定長でページに分ける構造
  • カラムが多すぎると1レコードが肥大化して効率が落ちる
  • サイズが大きくなりすぎるとテーブルスペースを圧迫してパフォーマンスが落ちる

ほどほどが大事
最適化方法はいろいろあるけど、「早く見つけられるように住所を整理しておく」みたいな話が多い


LSMツリーとの比較

  • LSMは書き込み処理が軽い(後でまとめて整理)
  • Bツリーは書き込み時に構造を調整するのでコストがかかる

読み込み最適化 vs 書き込み最適化の違いがわかると、用途で選びやすくなる

図3: B‑tree と LSM‑tree の書き込みパス比較


データは適した場所に

「ログでもなんでもDBに突っ込むのはNG」という話
この章の内容と紐づいた話で、適材適所のデータ配置の意識が大事だと感じた


クラスタ化インデックスとヒープファイル

  • ヒープファイルは便利だけど、更新のたびにインデックス再計算が発生しがち
  • クラスタ化インデックスは高速だけどテーブルサイズがでかくなる

折衷案として、「頻繁にアクセスされるものはクラスタ化」の選択肢もあり


空間充填曲線?

複数の値を1つのインデックスに変換する構造っぽい
まだちゃんと理解してないけど、地理情報系とかで使われるイメージ


インメモリDBとプロトコル変換コスト

インメモリDBはデータ変換オーバーヘッドが少なくて高速
媒体間のプロトコル変換って思ってるより重たい
あと、ネットワークレイテンシは光速が遅いのが悪い(^^)


ETLって何?

よく聞くけど正直よくわかってない単語代表🙄
分析用にデータを整えるプロセスらしい。GCP使ってるならBigQuery前提で設計することもあるかも?


スタースキーマ

小売系の開発で見たことある
外部キーばかりのテーブルから複数のリレーションを組み立ててデータを出してた
この章の話とつながるところがあったな


列ストレージと圧縮

  • 列ストレージは更新に弱そう
  • select * よりちゃんとカラムを絞ったほうが高速化する
  • 圧縮手法もイメージついてると、バグの原因切り分けに役立つことがある

マテリアライズド・ビューは、PostgreSQLの with materialize と似てる
使い方次第でかなり便利


✍️ まとめ

この章は、ちょっと泥臭いけど「なんでそれを使ってるのか」っていう技術の裏を覗けるパートだった
バズワード的に覚えてた用語も、「意味があるから存在してる」ことがわかってくると、設計の選択肢に深みが出る


💡 設計Tips

  • 構造を選ぶということは、読み書きのトレードオフを設計するということ
  • パフォーマンス問題の裏には、ほぼ確実に“データ構造選びのミスマッチ”がある
  • インデックスやログ設計は、アーキテクチャの“足回り”そのもの

🔙 目次に戻る

Discussion