_log

備忘録

SQLアンチパターン チートシート

SQLアンチパターンを再読した。今更だけど、後から見直すための簡易まとめ(ほぼ目次の整形)

SQLアンチパターン

SQLアンチパターン

Ⅰ.データベース論理設計のアンチパターン

タイトル 目的 アンチパターン 解決策
1 ジェイウォーク(信号無視) 複数の値を持つ属性を格納する カンマ区切りフォーマットのリストを格納する 交差テーブルを作成する
2 ナイーブツリー(素朴な木) 階層構造を格納し、クエリを実行する 常に親のみに依存する 代替ツリーモデルを使用する
3 IDリクワイアド(とりあえずID) 主キーの規約を確立する すべてのテーブルに「id」列を用いる 状況に応じて適切に調整する
4 キーレスエントリ(外部キー嫌い) データベースのアーキテクチャを単純化する 外部キー制約を使用しない 外部キー制約を宣言する
5 EAV(エンティティ・アトリビュート・バリュー) 可変属性をサポートする 汎用的な属性テーブルを使用する サブタイプのモデリングを行う
6 ポリモーフィック関連 複数の親テーブルを参照する 二重目的の外部キーを使用する 関連(リレーションシップ)を単純化する
7 マルチカラムアトリビュート(複数列属性) 複数の値を持つ属性を格納する 複数の列を定義する 従属テーブルを作成する
8 メタデータトリブル(メタデータ大増殖) スケーラビリティを高める テーブルや列をコピーする パーティショニングと正規化を行なう

Ⅱ.データベース物理設計のアンチパターン

タイトル 目的 アンチパターン 解決策
9 ラウンディングエラー(丸め誤差) 整数の代わりに小数値を使用する FLOATデータ型を使用する NUMERICデータ型を使用する
10 サーティワンフレーバー(31のフレーバー) 列を特定の値に限定する 限定する値を列定義で指定する 限定する値をデータで指定する
11 ファントムファイル(幻のファイル) 画像をはじめとする大容量メディアファイルを格納する 物理ファイルの使用を必須と思い込む 必要に応じてBLOB型を採用する
12 インデックスショットガン(闇雲インデックス) パフォーマンスを最適化する 闇雲にインデックスを使用する 「MENTOR」の原則に基いて効果的なインデックス管理を行う

Ⅲ.クエリのアンチパターン

タイトル 目的 アンチパターン 解決策
13 フィア・オブ・ジ・アンノウン(恐怖のunknown) 欠けている値を区別する NULLを一般値として使う、または一般値をNULLとして使う NULLを一意な値として扱う
14 アンビギュアスグループ(曖昧なグループ) グループ内で最大値を持つ行を取得する 非グループ化列を参照する 曖昧でない列を使用する
15 ランダムセレクション サンプル行をフェッチする データをランダムにソートする 特定の順番に依存しない
16 プアマンズ・サーチエンジン(貧者のサーチエンジン) 全文検索を行う パターンマッチ述語を使用する 適切なツールを使用する
17 スパゲッティクエリ SQLクエリの数を減らす 複雑な問題をワンステップで解決しようとする 分割統治する
18 インプリシットカラム(暗黙の列) タイプ数を減らす ショートカットの罠に陥る 列名を明示的に指定する

Ⅳ.アプリケーション開発のアンチパターン

タイトル 目的 アンチパターン 解決策
19 リーダブルパスワード(読み取り可能パスワード) パスワードのリカバリーとリセットを行なう パスワードを平文で格納する ソルトを付けてパスワードハッシュを格納する
20 SQLインジェクション 動的SQLを記述する 未検証の入力をコードとして実行する 誰も信用してはならない
21 シュードキー・ニートフリーク(疑似キー潔癖症) 欠番を詰める 隙間を埋める 疑似キーの欠番は埋めない
22 シー・ノー・エビル(臭いものに蓋) 簡潔なコードを書く 肝心な部分を見逃す エラーから優雅に回復する
23 ディプロマティック・イミュニティ(外交特権) ベストプラクティスを採用する SQLを特別扱いする 包括的に品質問題に取り組む
24 マジックビーンズ(魔法の豆) MVCのM(モデル)を単純化する モデルがアクティブレコードそのもの モデルがアクティブレコードを「持つ」ようにする
25 砂の城 サービスの安定稼働 想定不足 可能な限りの想定(ベンチマーク、テスト環境の構築、例外処理、バックアップ、高可用性、ディザスタリカバリ、運用ポリシーの策定)

ex.他(スライド)

タイトル 目的 アンチパターン 解決策
26 とりあえず削除フラグ データを消さずに、無いことにしたい 削除フラグの導入 「フラグ」以外の道も検討する



読んでいて過去の嫌な思い出も蘇る本だが、ある問題を解決しようとしてアンチパターンが発生する経緯が具体的に書かれており非常に読みやすい。

それぞれの具体例も少し書こうかと思ったが、監訳者による↓のコンパクトな神資料を発見したのでこちらを見返した方が断然分かりやすい。。

SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)

迷った際はこれらを横目に本に立ち返ろう。

しかし、テーブル記法だと読みづらかったか。。