「SQLアンチパターン」 #sqlap

1月末くらいに「SQLアンチパターン」を監訳者の和田さんから頂きました。 なぜ私ごときが頂けたのかわかりませんが、ちょうど読みたいと思っていたところだったので、ありがたく頂戴致しました。 それから1ヶ月くらいかけてやっと読み終わりました。遅読にもほどがあります。すいません。

デブサミで和田さんのサインをもらおうと思っていたのに、不覚にも持っていくのを忘れてしまいました。残念…。

SQLアンチパターン

SQLアンチパターン

裏表紙より

本書はDB設計やSQL記述の際に避けるべき事柄を1章で1つ、25個紹介するという書籍です。リレーショナルデータベースを中心に据えたシステム開発には、様々な場面で陥りやすい失敗(アンチパターン)があります。本書はデータベース論理設計、データベース物理設計、クエリの記述、アプリケーション開発という4つのカテゴリに分け、それぞれの分野におけるアンチパターンを紹介し、失敗を避けるためのより良い方法を紹介します。複数の値を持つ属性や再帰的なツリー構造の格納から、小数値の丸めやNULLの扱いに起因する問題、全文検索SQLインジェクションMVCアーキテクチャなど、実践的かつ幅広いトピックを網羅します。データベースに関わるすべてのエンジニア必携の一冊です。

原著は24章ですが、日本語版は nippondanji こと奥野さんの執筆による第25章「砂の城」が追加されていてお得です。

1章にひとつのアンチパターンが紹介されていて、各章は「目的」「アンチパターン」「アンチパターンの見つけ方」「アンチパターンを用いてもよい場合」「解決策」という構成になっています。

「目的」を達成するための手段として使われることがある「アンチパターン」を示し、「アンチパターンの見つけ方」でアンチパターンが使われてる兆候を示しています。「アンチパターンを用いてもよい場合」も書かれているところが本書のフェアなところですね。最後にアンチパターンを使わずに目的を達するための「解決策」が示されています。

以下、各アンチパターンについての感想など。

ジェイウォーク

あー、若いころやったわー。

ナイーブツリー

うーん、これはちょっとビミョーです。 解決策にあげられているものも、複雑という意味でアンチパターンに思えてしまいます。 というか、RDBMS だけでツリー構造を表そうとすること自体がアンチパターンかと。

個人的にはアンチパターンとされているナイーブツリーがシンプルで一番いいと思ってしまいます。プログラムでできることは、SQLで無理にやらない方が好みです。

IDリクワイアド

あー、これわかるわー。

Rails のテーブルの違和感がまさにこれ。

キーレスエントリ

あー、若いころやったわー。ていうか、昔は MySQL には外部キーの機能がなかったので…。

Rails は外部キー作れないのがいまいちですね。

エンティティ・アトリビュート・バリュー

あー、これ今でもやってるわー。直したいけど今さら直せない…。

ポリモーフィック関連

やったこともないし、やろうと思ったこともないのでよく分かりません。

マルチカラムアトリビュート

ふつうに正規化すれば、こんなアンチパターンを使うことにはならないですね。

メタデータトリブル

あー、若いころやったわー。MySQL には最近までパーティショニングなかったし…。

ラウンディングエラー

うーん、こんなことやる人いるのかなぁ…。

サーティワンフレーバー

これはやってるけど、アンチパターンなのかなぁ…。

ファントムファイル

あー、これはやってるわー。 でも、ちょうどファイルをデータベースに入れた方がいいと思ってたところだったので、納得。

インデックスショットガン

その昔、性能トラブルの現場に連れていかれて、インデックスを一つ張っただけで解決したことを思い出しました。

フィア・オブ・ジ・アンノウン

NULL の扱いで問題起こすのは初心者だけだと思いたい…。

アンビギュアスグループ

MySQL は変態だということがよく分かりますね。

ランダムセレクション

幸運にもランダムな行のフェッチが必要になったことはないです。

プアマンズ・サーチエンジン

監訳注で MySQL5.6 で InnoDB でも全文検索ができるようになったことが示されているのは素晴らしいです。 ですが、MySQL全文検索は普通は日本語文章には使用できないことに触れられても良かったんじゃないかと思いました。

スパゲッティクエリ

SQL文の発行数を減らした方が高速になると思ってた時期が自分にもありました…。

解決策にある UNION は MySQL では遅くなることがあるので注意ですね。

インプリシットカラム

あー、貧弱なオレオレフレームワークがこれやってるわー。

リーダブルパスワード

昔はやったことあるけど、最近はやらないなー。

SQLインジェクション

これアンチパターンなのかしら。

シュードキー・ニートフリーク

偉い人順に内部IDを割り当てないといけない…という笑い話のような話を聞いたことがあったのを思い出しました。

シー・ノー・エビル

なんというか、PHP は大変ですね…。

ディプロマティック・イミュニティ

ER図かいてません。テーブル定義のテストもしてません。すいません。

ER図は MySQL Workbench 使えばあとから動的に作れたりするからいいんじゃないかなぁとか思ったり…ごめんなさい。

マジックビーンズ

これはもう SQLアンチパターンというんじゃなくて、Rails をディスってますね。まあ同感です。

砂の城

奥野さんによる日本語版だけの特別な章です。この章のタイトルだけ日本語なのがカッコイイですね。 サービスの安定稼働に関して基本的な事項が簡潔にまとまっています。

おわりに

あえて各アンチパターンの内容は書きませんでした。気になった人は買って読んでみるのがいいと思います。

本書は、これからSQLをはじめる人や、SQLについてあまり詳しくない開発者にお勧めです。先人がハマった内容がまとまっているので、これを読むことで同じ轍を踏まなくてすみます。

SQLに詳しい人も、自分が当たり前にやっていて問題ないと思っていることが、もしかしたらアンチパターンとして示されているかもしれないので、一読してみるのがいいと思います。 あと、過去に自分がやらかしてしまった失敗にあてはまるアンチパターンを見ると、若かりしころの甘酸っぱい思い出が蘇るのでお勧めです。