SQLアンチパターンを読みました

by @dekokun on 2013/02/26 8:15

Tagged as: SQL, 書籍.

デプサミ2013和田さんのSQLアンチパターンの講演を聞けなかった腹いせにSQLアンチパターンを購入して読んでおりましたが読み終わりましたので投稿。

だいたいの内容

世のシステムのかなりの割合で使用されているとおもわれるRDBMSを使用したシステムを作る際に開発者(DBAなど含む)が陥りがちなアンチパターンがまとまっている本です。

「インデックスショットガン(無闇やたらとインデックスを貼りまくる)」などの「そりゃ当然やっちゃいけないよね」と誰しもが納得するものから、「IDリクワイアド(すべてのテーブルにID列をつける)」など、一部の人には「あれ、それって何がダメなんだっけー」というもの、「リーダブルパスワード(パスワードの値を読める状態でDBに保存)」などの、いわゆる「DB設計についての本」にはあまり載っていないようなものまで、幅広いアンチパターンが記載されています。

上記のようにそれぞれのアンチパターンには名前がついているのも「アンチパターンの広まりやすさ、会話への出しやすさが高まる」という点でうれしいところです。

一読した際の全体的な感想

  • 「このアンチパターンはここがだめ。代替策にはこれとこれとこれがある。ただ、この代替策をとると今度はここを注意しなくてはいけない」という例が豊富で、更にほとんどの場合に「アンチパターンを用いてもよい場合」が記述されているため、単純なアンチパターン集というよりは、「様々な解決したい問題に対しての策が複数提示され、それらの利点欠点がよく分かる本」というイメージが強い。
  • 今後「この方法を取りたいがこの方法にはどんな利点欠点があり、代替策にはどんなのがあるんだっけ」という際に手にとる時に最高の力を発揮すると思われる。
  • また、アンチパターンに名前がついているので、あとはみんながこの本を読みさえすれば「これはポリモーフィック関連になってるし直したいよね」とかいう会話ができるようになるし楽しいなぁ。この用語達浸透しないかなぁ。「私はIDリクワイアドが問題だとは思っていませんがあなたはどうですか」とか議論できたらいいなぁ。
  • 「はじめに」にも書いてあるが、「本書を読むことで、データベース管理者はソフトウェア開発者がどのような考えでミスを犯してしまうのかがわかります。」はまさにそのとおりだと思います。素敵です。
  • シュードキー・ニートフレークの最後にアンチパターンを使用しないように上司を説得方法が記載されているなど、この本は現実と向き合うことを重視していると感じられる。

新たに知ったことや強く感じたことなど

この本を読んで新たに知ったことや、強く感じるものがあった部分を説明。すでにSQLアンチパターンを読んだことのある人以外は理解できない文章

3章 IDリクワイアド

  • 本書を読む直前に達人に学ぶDB設計 徹底指南書 初級者で終わりたくないあなたへを読んでいまして「サロゲートキーは撤廃しろ」という主張を見て頭をガーンとやられた気分になっていたのですが、SQLアンチパターンにも同様の主張が見られるとは!!!
  • IDリクワイアドに関しては、かなりの数の技術者が「問題はない。むしろこうするべきだ」と言って実践しているだろうなと思います。実践するのはいいとして、少なくとも「自然キーの代わりにID列を作成してプライマリキーとすることによって重複行を許可するようになってしまう」というあたりは押さえておかないといけない部分ですね。

14章 アンビギュアスグループ

  • 単一値の原則(Single-Value Rule)という単語は初めて知った
  • 私は基本的にPostgreSQLからDBを学んできたために、group byなどを使用した際に集約関数を使用しない列が許容される場合があるのかと驚いた。MySQLやSQLiteはゆるふわちゃんで怖いわ…

17 章 スパゲッティクエリ

  • P193のCASE式とSUM関数を組み合わせて条件ごとに集計する方法すごい!!便利!!!!!

19章 リーダブルパスワード

  • 最近、「パスワードにはソルトをつけてハッシュ関数にかける」とか「ストレッチングをする」とか以前に「パスワードを不可逆な形で暗号化して保存しておく」ということすら知らない人の数が我々の想定よりははるかに多いのではないかという不安がよく押し寄せるのですが、「アンチパターン:リーダブルパスワード」という言葉が広まれば少しはマシになるのではないかなと思いました。

20章 SQLインジェクション

  • プリペアドステートメントを使用することによってクエリオプティマイザがおかしな判断をする場合があるのですね。なんという罠…
  • テーブルの識別子や列識別子、SQL予約後などのプリペアドステートメントを使用できない場合の解決策としての「ユーザの入力をコードから隔離する」方法、超便利ですね。

21章 シュードキー・ニートフレーク

  • GUIDなんて知りませんでした。

24章 マジックビーンズ

  • モデルがアクティブレコードを持つようにするの、とても便利じゃないですか。

初めてAmazonのリンクをはった。

初めて、読んだ本についてのブログを書いての感想

  • 書籍についてのブログ記事を書くのは初めてですが、今後は技術書を読み終わったら書いていこうかなと思います。
  • ブログを書く際に強制的にもう一度読み直すことになるのでとてもよいですね。
  • 本を読んで何を感じたかの記録になるのも良いです。
comments powered by Disqus