『SQLアンチパターン』を読んだ
3〜4年前に買って積ん読していた『SQLアンチパターン』を、最近やっと読了しました。*1
本書について
本書は、技術書の良書として有名で、「ITエンジニアが読むべき本」のようなまとめに挙がることも多いので、知っている方や既に読んだという方も多いでしょう。
本書では、著者が長年SQLに関する仕事に携わるなかで遭遇した25個のアンチパターンが紹介されています。
アンチパターンとは即ち、「SQLを使用するプログラマーが最も頻繁に犯しがちなミス」とのことです。*2
特徴
本書では25個のアンチパターンが紹介されていますが、それぞれにキャッチーな名前が付けられています。
これは、本書の冒頭部で書かれている、以下のような業界の慣例に従ったものでしょう。*3
世の中のアンチパターンの多くには、「黄金のハンマー(Golden Hammer)」「車輪の再発明(Reinventing the Wheel)」「委員会による設計(Design by Committee)」などの、ユーモラスで刺激的なタイトルがついています。優れたデザインパターンとアンチパターンには、比喩的で内容を連想しやすい名前を与えることが慣例となっています。
また、各章が統一された1つのフォーマットに従って構成されている、という点も特徴に挙げられるでしょう。 即ち、下の構成です:
このようにフォーマットが揃っているので、次に来る内容が予測しやすく、とても読みやすいです。
更に、導入部分はちょっとしたエピソード仕立てになっており、あわれな登場人物(=「あなた」)がいかにアンチパターンにハマったかが綴られています。
その点で、読み物としてもセンスの良さが感じられました。
どんなアンチパターンが紹介されているのか
本書で紹介されているアンチパターンは全て、以下のいずれかに該当するそうです。*4
- 著者がソフトウェア開発やRDBMS製品のテクニカルサポート、研修、インターネットフォーラムでのやりとりを通じて実際に見てきたもの
- 著者自らが陥ってしまったもの
私の(著者よりは乏しい)Webエンジニアとしての経験からは、以下のようなパターンがあると見受けられました:
- ①Webアプリケーションフレームワークを使っていてハマりがちなアンチパターン
- ②Web開発(RDBを使ったソフトウェア開発)の現場でよく見られるアンチパターン
- ③セキュリティ上、気をつけるべき問題
- その他
少しだけ例を紹介します。
①については、例えばRuby on RailsなどのWAFではすべてのテーブルに id
という名前のPrimary Keyを作るのがデフォルトの挙動となっていますが、その挙動は 「ID Required(とりあえずID)」 アンチパターンを生みかねません。
②に関して、 「Keyless Entry(外部キー嫌い)」「Multi-Column Attribute(複数列属性)」 あたりの章を読むと、胸がむかむかとしてきました。
名前から想像がつくかと思いますが、前者は外部キー制約を極端に避けるアンチパターン、後者は本来従属テーブルに切り出すべき属性を親テーブルに attr1, attr2, ...
のように複数のカラムで持たせてしまうものです。
「Index Shotgun(闇雲インデックス)」「Spaghetti Query(スパゲッティクエリ)」「Poor Man's Search Engine(貧者のサーチエンジン)」 などのアンチパターンの名前を聞くと、Web開発に馴染みのある方であれば、頭が痛くなってくる方もいるのではないでしょうか。
③については、 「Readable Passwords(読み取り可能パスワード)」 や 「SQL Injection(SQLインジェクション)」 はポピュラーな問題だと思います。
これらに当てはまらないものでは、私にとって馴染みが薄いものも多く、学びがありました。
本書を読むべき人は誰か
本書の冒頭部には、「初心者から経験豊富なエキスパートまで、あらゆる段階の方に役立つ内容をお届けします。」とあります。
私自身は、Webシステムの開発や運用に携わるようになってもう10年近く経ちますが、上に書いたように十分に学びがありました。
ただ、もっと早く読んでいればよかったな、という感は否めません。
RDBやSQLの入門書ではないので、全くの初心者向けとは言えないと思います。
RDBやSQLについてある程度学んで、かつ、実際に多少のシステム開発や運用を経験した上で読むと良いのではないでしょうか。
どちらかというと、開発時――中でも、DB設計時に考慮すべき事柄が多いと思います。
その意味で、DBAよりはむしろアプリケーション開発者が読むべき本かな、と思いました。
まとめ
掛け値なしの良書でした。
オススメです。
参考
- SQLアンチパターンをパッと思い出すための一覧 - 無印吉澤 ... アンチパターン名と概要と解決策がまとめられています。便利。