40
和田 卓人 (@t_wada) Feb 15, 2013 @ デブサミ SQL アンチパターン

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

Embed Size (px)

DESCRIPTION

【15-B-5】SQLアンチパターン - 開発者を待ち受ける25の落とし穴 2013/02/15 デブサミ 2013

Citation preview

Page 1: SQLアンチパターン - 開発者を待ち受ける25の落とし穴

和田 卓人 (@t_wada)Feb 15, 2013 @ デブサミ

SQLアンチパターン

Page 2: SQLアンチパターン - 開発者を待ち受ける25の落とし穴

和田 卓人id: t-wada@t_wadagithub: twada

Page 3: SQLアンチパターン - 開発者を待ち受ける25の落とし穴

諸君は自らの経験からいくらか学ぶことができるという、全く愚かな考えであろうが、余はむしろ他人の失敗を学ぶことで、自分の失敗を回避することを好む。

─オットー・フォン・ビスマルク

Nur ein Idiot glaubt, aus den eigenen Erfahrungen zu lernen.Ich ziehe es vor, aus den Erfahrungen anderer zu lernen, um von vorneherein eigene Fehler zu vermeiden.

Page 4: SQLアンチパターン - 開発者を待ち受ける25の落とし穴

1. 本書の構成2. アンチパターンとは3. おわりに

Agenda

Page 5: SQLアンチパターン - 開発者を待ち受ける25の落とし穴

4つの部25のパターン

Page 6: SQLアンチパターン - 開発者を待ち受ける25の落とし穴

1. 論理設計2. 物理設計3. クエリ4. アプリケーション

Page 7: SQLアンチパターン - 開発者を待ち受ける25の落とし穴

1. 論理設計2. 物理設計3. クエリ4. アプリケーション

Page 8: SQLアンチパターン - 開発者を待ち受ける25の落とし穴

1. ジェイウォーク(信号無視)2. ナイーブツリー(素朴な木)3. IDリクワイアド(とりあえずID)4. キーレスエントリ(外部キー嫌い)5. EAV(エンティティ・アトリビュート・バリュー)6. ポリモーフィック関連7. マルチカラムアトリビュート(複数列属性)8. メタデータトリブル(メタデータ大増殖)

論理設計のアンチパターン

ざわ…ざわ…

Page 9: SQLアンチパターン - 開発者を待ち受ける25の落とし穴

1. 論理設計2. 物理設計3. クエリ4. アプリケーション

Page 10: SQLアンチパターン - 開発者を待ち受ける25の落とし穴

09. ラウンディングエラー(丸め誤差)

10. サーティワンフレーバー(31のフレーバー)

11. ファントムファイル(幻のファイル)

12. インデックスショットガン(闇雲インデックス)

物理設計のアンチパターン

否定意見多し

Page 11: SQLアンチパターン - 開発者を待ち受ける25の落とし穴

1. 論理設計2. 物理設計3. クエリ4. アプリケーション

Page 12: SQLアンチパターン - 開発者を待ち受ける25の落とし穴

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

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

15. ランダムセレクション

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

17. スパゲッティクエリ

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

クエリのアンチパターン

様々な解決策

Page 13: SQLアンチパターン - 開発者を待ち受ける25の落とし穴

1. 論理設計2. 物理設計3. クエリ4. アプリケーション

Page 14: SQLアンチパターン - 開発者を待ち受ける25の落とし穴

19. リーダブルパスワード(読み取り可能パスワード)

20. SQLインジェクション

21. シュードキー・ニートフリーク(疑似キー潔癖症)

22. シー・ノー・エビル(臭いものに蓋)

23. ディプロマティック・イミュニティ(外交特権)

24. マジックビーンズ(魔法の豆)

25. 砂の城 奥野さん書き下ろし!

アプリケーションのアンチパターン

Page 15: SQLアンチパターン - 開発者を待ち受ける25の落とし穴

1. 本書の構成2. アンチパターンとは3. おわりに

Agenda

Page 16: SQLアンチパターン - 開発者を待ち受ける25の落とし穴

アンチパターンとはべからず集あるある集

だけでは無い!

Page 17: SQLアンチパターン - 開発者を待ち受ける25の落とし穴

0. 名前1. 目的2. アンチパターン3. アンチパターンの見つけ方4. アンチパターンを用いても良い場合5. 解決策

名前重要!!

本書のアンチパターンの構成

Page 18: SQLアンチパターン - 開発者を待ち受ける25の落とし穴

例: ナイーブツリー(素朴な木)

Page 19: SQLアンチパターン - 開発者を待ち受ける25の落とし穴

パターン名が英語そのままカタカナ表記であるのは、目次を見ただけではビックリするポイントですね。

ただ、チーム内で相談するときなどに目立つ名前が付いているのはむしろありがたいですし、何よりなんかカッコよくておもしろかったです!

http://d.hatena.ne.jp/moro/20130205/1360044434

なぜカタカナ!?

Page 20: SQLアンチパターン - 開発者を待ち受ける25の落とし穴

「あーはいはい”インデックスショットガン”乙」Explain の結果も見ないでインデックス貼りまく

る奴いるよねーーー

「”マルチカラムアトリビュート”とか 10 年前に通ったわー」

http://yoshiori.github.com/blog/2013/02/10/sql-antipatterns/

アンチパターン名で議論できるようになる

Page 21: SQLアンチパターン - 開発者を待ち受ける25の落とし穴

0. 名前1. 目的2. アンチパターン3. アンチパターンの見つけ方4. アンチパターンを用いても良い場合5. 解決策

実例: ナイーブツリー(素朴な木)

Page 22: SQLアンチパターン - 開発者を待ち受ける25の落とし穴

目的: 階層構造を格納し、クエリを実行する

Page 23: SQLアンチパターン - 開発者を待ち受ける25の落とし穴

0. 名前1. 目的2. アンチパターン3. アンチパターンの見つけ方4. アンチパターンを用いても良い場合5. 解決策

実例: ナイーブツリー(素朴な木)

Page 24: SQLアンチパターン - 開発者を待ち受ける25の落とし穴

アンチパターンとは何でしょうか。それは、問題の解決を意図しながらも、しばしば他の問題を生じさせてしまうような技法を指します。

─ Bill Karwin

よかれと思って裏目に出てしまうもの

Page 25: SQLアンチパターン - 開発者を待ち受ける25の落とし穴

CREATE TABLE Comments ( comment_id SERIAL PRIMARY KEY, parent_id BIGINT UNSIGNED, comment TEXT NOT NULL,);

親idが入る

アンチパターン: 常に親のみに依存する

Page 26: SQLアンチパターン - 開発者を待ち受ける25の落とし穴

SELECT c1.*, c2.*, c3.*, c4.*FROM Comments c1 -- 1階層目 LEFT OUTER JOIN Comments c2 ON c2.parent_id = c1.comment_id -- 2階層目 LEFT OUTER JOIN Comments c3 ON c3.parent_id = c2.comment_id -- 3階層目 LEFT OUTER JOIN Comments c4 ON c4.parent_id = c3.comment_id -- 4階層目

アンチパターンにより起こること

素朴すぎる故にアンチパターン

Page 27: SQLアンチパターン - 開発者を待ち受ける25の落とし穴

0. 名前1. 目的2. アンチパターン3. アンチパターンの見つけ方4. アンチパターンを用いても良い場合5. 解決策

実例: ナイーブツリー(素朴な木)

Page 28: SQLアンチパターン - 開発者を待ち受ける25の落とし穴

直面している問題の種類や、メンバー間の会話での何気ない言葉が、そこにアンチパターンがあるかもしれないことに気づくヒントになります。

─ Bill Karwin

Page 29: SQLアンチパターン - 開発者を待ち受ける25の落とし穴

アンチパターンの見つけ方

「このツリーでは、深さを何階層までサポートすればいい?」

「ツリー型のデータ構造を扱うコードなんて二度と書きたくないな」

「ツリーの中で孤児になった行をきれいにするために、定期的にスクリプトを実行しなければ」

Page 30: SQLアンチパターン - 開発者を待ち受ける25の落とし穴

0. 名前1. 目的2. アンチパターン3. アンチパターンの見つけ方4. アンチパターンを用いても良い場合5. 解決策

実例: ナイーブツリー(素朴な木)

Page 31: SQLアンチパターン - 開発者を待ち受ける25の落とし穴

WITH CommentTree (comment_id, bug_id, parent_id, author, comment, depth)AS ( SELECT *, 0 AS depth FROM Comments WHERE parent_id IS NULL UNION ALL SELECT c.*, ct.depth+1 AS depth FROM CommentTree ct JOIN Comments c ON ct.comment_id = c.parent_id)SELECT * FROM CommentTree WHERE bug_id = 1234;

アンチパターンを用いても良い場合共通テーブル式(CTE:common table expression)

を使って再帰クエリを書ける場合

Page 32: SQLアンチパターン - 開発者を待ち受ける25の落とし穴

本書にはアンチパターンを適用しても良い状況の説明もあって好感が持てます。 (略) この本は単なる「べからず集」ではなく「パターン本」だからです。コンテキストや制約が異なれば導かれる解法も異なるというわけです。

アンチパターンを用いても良い場合

http://yojik.hatenablog.jp/entry/2013/02/13/235729

Page 33: SQLアンチパターン - 開発者を待ち受ける25の落とし穴

0. 名前1. 目的2. アンチパターン3. アンチパターンの見つけ方4. アンチパターンを用いても良い場合5. 解決策

実例: ナイーブツリー(素朴な木)

Page 34: SQLアンチパターン - 開発者を待ち受ける25の落とし穴

解決策: 代替ツリーモデルを使用する

comment_id path 発言者 コメント

1 1/ Fran このバグの原因は何かな?

2 1/2/ Ollie ヌルポインターのせいじゃないかな?

3 1/2/3/ Fran そうじゃないよ。それは確認済みだ。

4 1/4/ Kukla 無効なインプットを調べてみたら?

5 1/4/5/ Ollie そうか、バグの原因はそれだな。

6 1/4/6/ Franよし、じゃあチェック機能を追加して

もらえるかな?

7 1/4/6/7/ Kukla 了解。修正したよ。

策1: 経路列挙 (Path Enumeration)

Page 35: SQLアンチパターン - 開発者を待ち受ける25の落とし穴

2. 入れ子集合NestedSet

3. 閉包テーブルClosure Table

解決策: 代替ツリーモデルを使用する

Page 36: SQLアンチパターン - 開発者を待ち受ける25の落とし穴

設計 テーブル数

子へのクエリ実行

ツリーへのクエリ実行 挿入 削除 参照整合性

維持

隣接リスト 1 簡単 難しい 簡単 簡単 可能

再帰クエリ 1 簡単 簡単 簡単 簡単 可能

経路列挙 1 簡単 簡単 簡単 簡単 不可

入れ子集合 1 難しい 難しい 難しい 難しい 不可

閉包テーブル 2 簡単 簡単 簡単 簡単 可能

解決策: 代替ツリーモデルを使用する

解決策の比較表

Page 37: SQLアンチパターン - 開発者を待ち受ける25の落とし穴

1. 本書の構成2. アンチパターンとは3. おわりに

Agenda

Page 38: SQLアンチパターン - 開発者を待ち受ける25の落とし穴

この本の素晴らしいところは、よく見る「悪い」方法を「悪いこと」としてまとめてくれたことです。

この問題!進研ゼミでやったところだ!

http://bleis-tift.hatenablog.com/entry/2013/02/14/SQLアンチパターン

http://yojik.hatenablog.jp/entry/2013/02/13/235729

アンチパターンを共有しよう!

Page 39: SQLアンチパターン - 開発者を待ち受ける25の落とし穴

SummitDevelopers

Developers Summit 2013 Action !

アンチパターンを共有しよう!

•経験した失敗に、名前、目的、アンチパターン(裏目に出た方法)、その見つけ方などを考えてみよう。

•「どうすればよかったか」を考えてみよう。

•それを共有しよう!

39

N E X T   A C T I O N !

Page 40: SQLアンチパターン - 開発者を待ち受ける25の落とし穴

ご清聴ありがとうございました

本書のハッシュタグは#sqlap です!