Chapter 07

【アンチパターン】クエリ(SQL)

たなかなた
たなかなた
2022.12.08に更新

フィア・オブ・ジ・アンノウン(恐怖のunknown)

  • やりたい事
    • NULLを含みうる列に対してクエリを書きたい
  • アンチパターン
    • 一般値としてNULLを扱う(NULLは、ゼロでも文字列でも真偽値でもない。そこには何もないし、それが何なのかも分からない。)
  • 解法
    • "2値論理"ではあく"3値論理"を意識し、データ型に限らず欠落の場合のみNULLを用いる
  • 参考文献

アンビギュアスグループ(曖昧なグループ)

  • やりたい事
    • グループ内で単一の行を取得したい
  • アンチパターン
    • 単一値の原則に反するクエリを書く(DB製品が曖昧なクエリを保証してくれないため。MySQLとSQLiteは特殊。)
  • 解法
    • 曖昧ではない列を使用する(関数従属性、相関サブクエリ、導出テーブル、外部結合、など)
  • 参考文献

ランダムセレクション

  • やりたい事
    • ランダムに1行のみ取得したい
  • アンチパターン
    • テーブル全体をランダムにソートする(インデックスがきかないため、データ量が増えるたびに遅くなる)
  • 解法
    • 乱数で行を決める、ベンダ組込関数を使う、アプリケーションコード側でOFFSETを使う、など
  • 参考文献

プアマンズ・サーチエンジン(貧者のサーチエンジン)

  • やりたい事
    • 全文検索したい
  • アンチパターン
    • パターンマッチ述語を用いる(インデックスが使われない。意図しないマッチを引き起こす。)
  • 解法
    • ベンダ独自機能のテキストインデックスを用いる。サードパーティーツールを用いる。転置インデックスを自作する。
  • 参考文献

スパゲッティクエリ

  • やりたい事
    • クエリの数を減らしたい
  • アンチパターン
    • 複雑なタスクを、一つのクエリで実現しようとする(デカルト積の発生。スケーラビリティやパフォーマンスを欠いた煩雑な処理に成り下がる。)
  • 解法
    • タスクを分割する。クエリを分割する。シンプルな結果をUNIONで結合する。CASE式を用いる。など。
  • 参考文献

インプリシットカラム(暗黙の列)

  • やりたい事
    • 構文をシンプルにしたい
  • アンチパターン
    • ワイルドカードを用いる(スケーラビリティやパフォーマンスに影響を及ぼす)
  • 解法
    • 明示的に列名を指定する(ワイルドカードはYAGNI原則に反するため。ポカヨケにも繋がる。)
  • 参考文献