このチャプターの目次
フィア・オブ・ジ・アンノウン(恐怖のunknown)
- やりたい事
- NULLを含みうる列に対してクエリを書きたい
- アンチパターン
- 一般値としてNULLを扱う(NULLは、ゼロでも文字列でも真偽値でもない。そこには何もないし、それが何なのかも分からない。)
- 解法
- "2値論理"ではあく"3値論理"を意識し、データ型に限らず欠落の場合のみNULLを用いる
- 参考文献
アンビギュアスグループ(曖昧なグループ)
- やりたい事
- グループ内で単一の行を取得したい
- アンチパターン
- 単一値の原則に反するクエリを書く(DB製品が曖昧なクエリを保証してくれないため。MySQLとSQLiteは特殊。)
- 解法
- 曖昧ではない列を使用する(関数従属性、相関サブクエリ、導出テーブル、外部結合、など)
- 参考文献
ランダムセレクション
- やりたい事
- ランダムに1行のみ取得したい
- アンチパターン
- テーブル全体をランダムにソートする(インデックスがきかないため、データ量が増えるたびに遅くなる)
- 解法
- 乱数で行を決める、ベンダ組込関数を使う、アプリケーションコード側でOFFSETを使う、など
- 参考文献
プアマンズ・サーチエンジン(貧者のサーチエンジン)
- やりたい事
- 全文検索したい
- アンチパターン
- パターンマッチ述語を用いる(インデックスが使われない。意図しないマッチを引き起こす。)
- 解法
- ベンダ独自機能のテキストインデックスを用いる。サードパーティーツールを用いる。転置インデックスを自作する。
- 参考文献
スパゲッティクエリ
- やりたい事
- クエリの数を減らしたい
- アンチパターン
- 複雑なタスクを、一つのクエリで実現しようとする(デカルト積の発生。スケーラビリティやパフォーマンスを欠いた煩雑な処理に成り下がる。)
- 解法
- タスクを分割する。クエリを分割する。シンプルな結果をUNIONで結合する。CASE式を用いる。など。
- 参考文献
インプリシットカラム(暗黙の列)
- やりたい事
- 構文をシンプルにしたい
- アンチパターン
- ワイルドカードを用いる(スケーラビリティやパフォーマンスに影響を及ぼす)
- 解法
- 明示的に列名を指定する(ワイルドカードはYAGNI原則に反するため。ポカヨケにも繋がる。)
- 参考文献