Implicit Columns
Take all you want, but eat all you take.
- select list の
*
を使うな -
JOIN時に同名のカラムが隠れてしまう
- Books.title
-
Authors.title
- salutation的な
Objective: Reduce Typing
- SELECT文のselect listの
*
- INSERT文の
VALUES (DEFAULT,
Antipattern: A Shortcut that Gets You Lost
Breaking Refactoring
-
テーブルにカラムを追加すると
- INSERT文が動かなくなる
- 列の位置に依存したアプリケーションコードが動かなくなる
Hidden Costs
- 不要な列もフェッチしてしまい、トラフィック増大
You Asked for It, You Got It
- 「指定した列以外全部取る」ということはできません
- 全部取るか、指定した列を取るかだけ
How to Recognize the Antipattern
-
implicit columnsを濫用して生じるトラブルのシナリオ
-
「アプリケーションが動かなくなった。DBから取得したデータのカラムを参照するとき、古いカラム名を使ってしまっているからだ。修正が漏れたらしい」
*
を使うと影響範囲を調べるのが大変
-
「ネットワークのボトルネックを調査したところ、DBサーバのトラフィックに原因があることがわかった。フェッチしているデータ量の1/10以下しか表示していない」
- データフェッチしすぎ
-
Legitimate Uses of the Antipattern
-
調査時などの、その場限りのクエリ
- メンテナンス性不要
-
結合時、各テーブルについて
*
を使える- 同名のカラムが隠れてしまう問題の回避
- タイプ量の少なさ、クエリの短さを実行時性能よりも優先するならどうぞ
Solution: Name Columns Explicitly
Mistake-Proofing
- ぽかよけ
-
fail early principle
- トラブルシューティングしやすくなる
You Ain’t Gonna Need It
- 開発・テスト中はSQLクエリ結果のトラフィックは無害に見える
-
本番環境で牙をむく
- 秒間何千ものクエリが飛び交う
*
を捨てると、select listにカラムを明示することになる- すると、「タイプ量を減らしたい」という思いから、余計なカラムをフェッチしなくなるはず
- 帯域を少なくできる
You Need to Give Up Wildcards Anyway
-
カラムを明示することで後で楽できる
- エイリアス定義
- 関数適用
- select listから除く