SQLアンチパターン

献本いただきました。ありがとうございます。

当たり前を当たり前にできる可能性を秘めた本

この本の素晴らしいところは、よく見る「悪い」方法を、「悪いこと」としてまとめてくれたことです。 今までは、筋のよくない設計やSQLを考え直してもらうためにあれこれと言葉を尽くして説明する必要がありました。 その結果として、直してもらえることもありましたが、直してもらえないことも多くありました。

この本が出たことによって、今後は「SQLアンチパターンという本にアンチパターンとして載っていますよ」と、強力な理由づけの一つとなるでしょう。 この本は「自分の中の当たり前をみんなのあたりまえにできる可能性を秘めている」と感じます。

参考文献

付録Bに参考文献がまとめられているのですが、新しい版が出ているものもありますので、自分の把握している範囲で補足します。

Joe Celko's SQL for smarties

訳書としては、第二版のみですが、原著では第四版が最新です。 あぁ、まだ第三版全部読んでないのに・・・

ちなみに、第三版からかなり分厚くなっており、あれが訳される際は分冊になるんじゃないですかね・・・

Joe Celko's Trees and Hierarchies in SQL for Smarties

こちらは訳書は出ていませんが、原著はすでに第二版が出ています。 第一版からは、以下の内容が追加されているようです。

  • General Graphs
  • Petri Nets
  • State Transition Graphs

An introduction to database systems

訳書はすでに手に入れるのが難しい本ですが、原著は第八版まで出ています。

NULLの「予想に反する」挙動

P.151の「13.5 解決策:NULLを一意な値として使う」では、NULLの「予想に反する」挙動をまとめているのですが・・・
説明としては、13.5.1の本文で十分なのに、表が残念なうえ、13.5.2は全体的に残念です。

NULLの挙動が分かりにくいのは、TRUEや'string'、12345との比較や、論理式を組み合わせた場合ではないです。 これらは、NULLを「わからないもの」と考えれば素直に理解できます。

例えば、NULL = 0がNULLになるのは、NULLのことを「0かもしれないし、1かもしれないし、100かもしれない」と考えればいいです。 そんなものを0と比較しても、結果は「TRUEかもしれないし、FALSEかもしれない」としか言えません(つまり結果もNULLですね)。

論理式も同様です。 NULL AND TRUEがNULLになるのは、NULLのことを「TRUEかもしれないし、FALSEかもしれない」と考えれば、結果は「TRUEかもしれないし、FALSEかもしれない」ですよね。
それに対して、NULL AND FALSEがFALSEになるのは、NULLがTRUEであろうがFALSEであろうが、FALSEとANDすれば結果は常にFALSEです(TRUE AND FALSEも、FALSE AND FALSEも、どちらもFALSE)。 NULL OR TRUEがTRUEになるのも同じ考え方で導き出せます。

NULLが怖いのは、演算の結果一つ一つではなく、「NULLが式のどこかに紛れ込んだとき」であり、「頭から抜けてしまったNULL」です。 多くのプログラマは、

x < 10

なんて式を見たら真か偽が返ると思ってしまいます。 こんな単純な式なら大丈夫な人でも、式が複雑になればなるほど、その式の結果がNULLによって自分の想定とは違うものになる可能性が高くなっていきます。

それが嫌なら、NOT NULL制約はNULLが必要な場合のみ付けず、基本的に付けるという方針がいいでしょう。

経路列挙モデル

経路列挙モデル他、階層構造を表現する代表的な方法についての言及があり、さらに各手法の比較まで載っており、素晴らしいですね。 ちなみに、経路列挙モデルをサポートしたHierarchyIdという型がSQL Server 2008から実装されており、SQL Serverでは手軽に経路列挙モデルの設計が行えます。

そして再帰CTEについても言及があるのですが、「ツリーへのクエリ実行」が「簡単」になっていて、お、おう・・・という感じです。 まぁ、再帰CTEもそろそろもっと広まっていいと思いますね。