msksgm’s blog

msksgm’s blog

Webエンジニアです。日々の勉強記録、技術書感想、美術観賞感想を投稿します。

「失敗から学ぶ RDB の正しい歩き方」感想

概要

「失敗から学ぶ RDB の正しい歩き方」を会社の人に推薦されたので読みました。 感想について記述していきます。

DB 関連で言えば過去に、「達人に学ぶ SQL 徹底指南書」、「SQL アンチパターン」、「絵で見てわかる OS/ストレージ/ネットワーク」、「達人に学ぶ DB 設計 徹底指南書 初級者で終わりたくないあなたへ」を読みました。

感想

DB 設計におけるアンチパターンをわかりやすく簡潔にまとめられた書籍でした。 本書でも度々引用されてる「SQL アンチパターン」と似通った内容となっています。 詳細な説明は「SQL アンチパターン」を参照するように書かれている箇所があるので、併せて読むと一層理解が深まると思います。

本書でまとめられているアンチパターンの一部は以下のようになっています。

  • 不適切な名前が付けられたカラム
  • 更新によって失われた事実
  • JOIN
  • インデックス
  • フラグ
  • ソート
  • ポリモーフィック関連
  • JSON
  • 強過ぎる制約
  • バックアップ
  • エラーログ
  • 監視
  • ロック
  • 不整合キャッシュ
  • 複雑なクエリ
  • コンフィグ
  • バージョン管理
  • フレームワーク依存症

DB 設計の段階で当たり前のように気を付ける問題から、あまり意識しないけれども気がついたときには手遅れな内容までまとまっていました。 一番印象的だったのは、トランザクション分離レベルが以下のように存在し、発生する現象が異なることです。

レベル ダーティーリード ファジーリード ファントムリード ロストアップデート
read uncommited 発生 発生 発生 発生
read commited 発生しない 発生 発生 発生
compatible read 発生しない 発生しない 発生 発生
serializable 発生しない 発生しない 発生しない 発生しない
名前 現象
ダーティーリード ほかのトランザクションから自分のコミットしていない変更内容が見えてしまう現象
ファジーリード ほかのトランザクションのコミットしていないデータはみえない、不正後はおきないが、並列処理のときに意識する必要がある
ファントムリード ほかのトランザクションがコミットした追加・削除が見えてしまう現象
ロストアップデート 複数のトランザクションで更新が並列に行われた場合、あとに実行されたトランザクションで結果が上書きされる現象

処理自体もそうですが、ファジーリードは、PostgreSQL では発生し MySQL では発生しないため、要注意だと思いました。

本書では、PostgreSQLMySQL を対象に解説が進みます。 2 つの DB の具体的な違いや、バージョンによって機能や挙動の違いがまとまれていたので、非常に参考になりました。 自分は、DB を使用する時には、既にに公開されている docker-compose.yaml をそのまま参考にしていただけなので、本番環境で使うときにはバージョンの違いを意識する気持ちが生まれました。

他には DBA しか触らないであろう設定(ログ、監視、コンフィグ、バージョン管理)について簡潔にアンチパターンをまとめらていたのもよかったです。 これらは特に触れる機会が少ないと思うので、個人開発レベルでも設定の際には意識したいと思いました。

本書でも書いてありますが、読み終えたあとに実際に改善していくことをおすすめします。 実際に DB 設計を眺めてみるでもいいですし、設定の確認、エラーログの監視などでもいいと思います。 個人的な話では、普段の業務で監視(ヘルスチェック)の作業もあったのですが、あまり深く意味を考えていませんでした。 今回の本を読んで、たとえ値が安定していたとしても、意味を読み取ろうと考えました。

まとめ