読書メモ。2025年66冊目。
『SQLアンチパターン 第2版』を読んでの感想となります。(2025/10/17記載)
本の概要
リレーショナルデータベースを扱うシステム開発には、様々な場面で陥りやすい失敗(アンチパターン)が存在します。本書では、SQLやデータベース設計を深く掘り下げ、データモデリングやSQLクエリのロジック、データ駆動アプリケーションのコード設計におけるアンチパターンを紹介し、それらを回避するための実践的な方法を解説します。
ツリー構造や継承構造のテーブル設計、NULLを正しく扱う手法、ランダムに結果を返すクエリやグループ化を行うクエリのコツ、SQLインジェクションなどのセキュリティリスクからウェブアプリケーションを守る手法など、幅広いトピックを網羅します。
第2版では内容を大幅に改訂し、新規書き下ろしの章と15のミニ・アンチパターンが加わりました。
日本語版付録として、奥野幹也氏による書き下ろしのアンチパターン「砂の城」を「関連ファイル」からダウンロードできます。
引用:
動機
- 第2版の発表に発売を楽しみにしていた。
- 新しいプロダクト開発がはじまり1からのDB設計機会を得ている。
- 開発生産性カンファレンスのサイン会でt_wadaさんに学びをプロダクトに還元します!と宣言してきたので今こそ再読。
本書からの学び
初版含め2回目の通読でした。
18年エンジニアをやっていると、何回か1からDB設計をした経験があります。
無事に本番稼働までシステムを作りあげ、軌道に乗せたこともあります。
問題なのは、そうしたシステムに長期的に付き合うことが無く、
自分の設計がシステムにどのような影響を与えていくかを経験として学習する機会が少ないことにあると感じています。
なので、システムがリリースされて満足して終わり、駄目だった設計を失敗として学ぶ機会が少ないのではないかと考えています。
また、仮に失敗から学んでも次の実践に繋げる機会を得にくいこともあると思います。
そして、ソースコードよりもテーブル設計のリファクタリングは難しく、駄目な部分は負債として積まれていく。
『SQLアンチパターン』はそうした避けるべきSQL周りの駄目な設計を学ぶことが良書だと感じています。
18年エンジニアをやっていると、大抵のアンチパターンはどこかで踏んだことがある内容ですが、それを他者に体系的に伝えるのは難しい。
だからこそ、長い時間を越えて第2版を迎えるぐらい価値のある一冊だと改めて感じました。
忘れたくないメモ
本書で特に印象に残ったポイントをふりかえります。
アンチパターン:外部キーはテストデータを用意するのを煩雑にするので張らない方が良い
外部キーは、不要なコードを書く手間を省き、データベースを変更してもすべてのコードが同じように適切に動作することを保証します。コードの開発時間だけでなく、修正や保守の時間も大幅に削減できます。ソフトウェアの世界では、平均するとコード1,000行ごとに15個から50個のバグが生じると言われています。これを基準として考えれば、コードの行数が少なければ、バグも少なくなります。
昔、外部キーはテストのためにレコードを用意するにあたって邪魔になるので使わない方が良いという現場で稼働していたことがあります。
しばらくそのことを健全な方法論のひとつとして認識していました。
その時の自分に読み聞かせてあげたい。テストのレコードは正しい順番で用意すれば良いだけで、バグを埋め込むリスクに比べれば些細な手間でしかない。
欠けている値
欠けている値を表すことこそがNULLの目的であると言いました。他のどのような値を選択したとしても、その値を特別なものとして扱うためにアプリケーションコードを修正しなければなりません。
NULLをNULLとしてしか意識できていなくなっていたことに気が付きました。
NULLは欠けている値。
スパゲッティクエリ
1つのクエリで複数のタスクを行おうとすると、意図しない結果が導かれるだけでなく、クエリの記述や修正、デバッグが難しくなるという点も肝に銘じておくべきです。データベースアプリケーションでは、頻繁に機能追加が求められることを忘れてはなりません。上司からさらに詳細なレポートの生成やユーザーインタフェースのフィールド追加を要求されることも、十分に考えられます。複雑で巨大な SQL クエリを設計してしまうと、それらの修正に労力と時間がかかります。 言うまでもなく、あなたにとってもプロジェクトにとっても、時間は極めて貴重なものであるはずです。
ドキュメントベースでSQLを考えると、こうした状態に陥りやすい気がしています。
改善拡張されていくことを前提にプロダクトを考えると、取り扱いやすい状態のSQLに対する理解が必要。
補足
デブサミの講演も良かったです…!!