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

35,728 views

Published on

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

Published in: Technology
1 Comment
104 Likes
Statistics
Notes
  • スタンド名みたいなのいっぱいある
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
No Downloads
Views
Total views
35,728
On SlideShare
0
From Embeds
0
Number of Embeds
11,113
Actions
Shares
0
Downloads
211
Comments
1
Likes
104
Embeds 0
No embeds

No notes for slide

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

  1. 1. SQLアンチパターン 和田 卓人 (@t_wada)Feb 15, 2013 @ デブサミ
  2. 2. 和田 卓人id: t-wada@t_wadagithub: twada
  3. 3. 諸君は自らの経験からいくらか学ぶことができるという、全く愚かな考えであろうが、余はむしろ他人の失敗を学ぶことで、自分の失敗を回避することを好む。 ─オットー・フォン・ビスマルクNur ein Idiot glaubt, aus den eigenen Erfahrungen zu lernen.Ich ziehe es vor, aus den Erfahrungen anderer zu lernen, umvon vorneherein eigene Fehler zu vermeiden.
  4. 4. Agenda1. 本書の構成2. アンチパターンとは3. おわりに
  5. 5. 4つの部25のパターン
  6. 6. 1. 論理設計2. 物理設計3. クエリ4. アプリケーション
  7. 7. 1. 論理設計2. 物理設計3. クエリ4. アプリケーション
  8. 8. 論理設計のアンチパターン1. ジェイウォーク(信号無視) ざわ…ざわ…2. ナイーブツリー(素朴な木)3. IDリクワイアド(とりあえずID)4. キーレスエントリ(外部キー嫌い)5. EAV(エンティティ・アトリビュート・バリュー)6. ポリモーフィック関連7. マルチカラムアトリビュート(複数列属性)8. メタデータトリブル(メタデータ大増殖)
  9. 9. 1. 論理設計2. 物理設計3. クエリ4. アプリケーション
  10. 10. 物理設計のアンチパターン09. ラウンディングエラー(丸め誤差)10. サーティワンフレーバー(31のフレーバー) 否定意見多し11. ファントムファイル(幻のファイル)12. インデックスショットガン(闇雲インデックス)
  11. 11. 1. 論理設計2. 物理設計3. クエリ4. アプリケーション
  12. 12. クエリのアンチパターン13. フィア・オブ・ジ・アンノウン(恐怖のunknown)14. アンビギュアスグループ(曖昧なグループ) 様々な解決策15. ランダムセレクション16. プアマンズ・サーチエンジン(貧者のサーチエンジン)17. スパゲッティクエリ18. インプリシットカラム(暗黙の列)
  13. 13. 1. 論理設計2. 物理設計3. クエリ4. アプリケーション
  14. 14. アプリケーションのアンチパターン19. リーダブルパスワード(読み取り可能パスワード)20. SQLインジェクション21. シュードキー・ニートフリーク(疑似キー潔癖症)22. シー・ノー・エビル(臭いものに蓋)23. ディプロマティック・イミュニティ(外交特権)24. マジックビーンズ(魔法の豆)25. 砂の城 奥野さん書き下ろし!
  15. 15. Agenda1. 本書の構成2. アンチパターンとは3. おわりに
  16. 16. アンチパターンとはべからず集あるある集 だけでは無い!
  17. 17. 本書のアンチパターンの構成 名前重要!!0. 名前1. 目的2. アンチパターン3. アンチパターンの見つけ方4. アンチパターンを用いても良い場合5. 解決策
  18. 18. 例: ナイーブツリー (素朴な木)
  19. 19. なぜカタカナ!?パターン名が英語そのままカタカナ表記であるのは、目次を見ただけではビックリするポイントですね。ただ、チーム内で相談するときなどに目立つ名前が付いているのはむしろありがたいですし、何よりなんかカッコよくておもしろかったです! http://d.hatena.ne.jp/moro/20130205/1360044434
  20. 20. アンチパターン名で議論できるようになる「 マルチカラムアトリビュート とか 10 年 前に通ったわー」「あーはいはい インデックスショットガン 乙」Explain の結果も見ないでインデックス貼りまく る奴いるよねーーーhttp://yoshiori.github.com/blog/2013/02/10/sql-antipatterns/
  21. 21. 実例: ナイーブツリー(素朴な木)0. 名前1. 目的2. アンチパターン3. アンチパターンの見つけ方4. アンチパターンを用いても良い場合5. 解決策
  22. 22. 目的: 階層構造を格納し、クエリを実行する
  23. 23. 実例: ナイーブツリー(素朴な木)0. 名前1. 目的2. アンチパターン3. アンチパターンの見つけ方4. アンチパターンを用いても良い場合5. 解決策
  24. 24. アンチパターンとは何でしょうか。それは、問題の解決を意図しながらも、しばしば他の問題を生じさせてしまうような技法を指します。 ─ Bill Karwin よかれと思って裏目 に出てしまうもの
  25. 25. アンチパターン: 常に親のみに依存するCREATE TABLE Comments ( comment_id SERIAL PRIMARY KEY, parent_id BIGINT UNSIGNED, comment TEXT NOT NULL,); 親idが入る
  26. 26. アンチパターンにより起こること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階層目 素朴すぎる故に アンチパターン
  27. 27. 実例: ナイーブツリー(素朴な木)0. 名前1. 目的2. アンチパターン3. アンチパターンの見つけ方4. アンチパターンを用いても良い場合5. 解決策
  28. 28. 直面している問題の種類や、メンバー間の会話での何気ない言葉が、そこにアンチパターンがあるかもしれないことに気づくヒントになります。 ─ Bill Karwin
  29. 29. アンチパターンの見つけ方「このツリーでは、深さを何階層までサポートすればいい?」「ツリー型のデータ構造を扱うコードなんて二度と書きたくないな」「ツリーの中で孤児になった行をきれいにするために、定期的にスクリプトを実行しなければ」
  30. 30. 実例: ナイーブツリー(素朴な木)0. 名前1. 目的2. アンチパターン3. アンチパターンの見つけ方4. アンチパターンを用いても良い場合5. 解決策
  31. 31. アンチパターンを用いても良い場合共通テーブル式(CTE:common table expression) を使って再帰クエリを書ける場合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;
  32. 32. アンチパターンを用いても良い場合本書にはアンチパターンを適用しても良い状況の説明もあって好感が持てます。 (略) この本は単なる「べからず集」ではなく「パターン本」だからです。コンテキストや制約が異なれば導かれる解法も異なるというわけです。http://yojik.hatenablog.jp/entry/2013/02/13/235729
  33. 33. 実例: ナイーブツリー(素朴な木)0. 名前1. 目的2. アンチパターン3. アンチパターンの見つけ方4. アンチパターンを用いても良い場合5. 解決策
  34. 34. 解決策: 代替ツリーモデルを使用する 策1: 経路列挙 (Path Enumeration)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 了解。修正したよ。
  35. 35. 解決策: 代替ツリーモデルを使用する2. 入れ子集合NestedSet 3. 閉包テーブル Closure Table
  36. 36. 解決策: 代替ツリーモデルを使用する 解決策の比較表 テーブ 子へのクエ ツリーへの 参照整合性 設計 挿入 削除 ル数 リ実行 クエリ実行 維持隣接リスト 1 簡単 難しい 簡単 簡単 可能再帰クエリ 1 簡単 簡単 簡単 簡単 可能経路列挙 1 簡単 簡単 簡単 簡単 不可入れ子集合 1 難しい 難しい 難しい 難しい 不可閉包テーブル 2 簡単 簡単 簡単 簡単 可能
  37. 37. Agenda1. 本書の構成2. アンチパターンとは3. おわりに
  38. 38. アンチパターンを共有しよう!この本の素晴らしいところは、よく見る「悪い」方法を「悪いこと」としてまとめてくれたことです。 http://bleis-tift.hatenablog.com/entry/2013/02/14/SQLアンチパターン この問題! 進研ゼミでやったところだ! http://yojik.hatenablog.jp/entry/2013/02/13/235729
  39. 39. Developers Summit アンチパターンを共有しよう!N E X T   A C T I O N !• 経験した失敗に、名前、目的、アンチパター ン(裏目に出た方法)、その見つけ方などを考 えてみよう。• 「どうすればよかったか」を考えてみよう。• それを共有しよう! Developers Summit 2013 Action ! 39
  40. 40. ご清聴ありがとうございました本書のハッシュタグは #sqlap です!

×