狠狠撸

狠狠撸Share a Scribd company logo
SQL
アンチパターン
  和田 卓人 (@t_wada)
Feb 15, 2013 @ デブサミ
和田 卓人
id: t-wada
@t_wada
github: twada
諸君は自らの経験からいくらか学ぶことがで
きるという、全く愚かな考えであろうが、
余はむしろ他人の失敗を学ぶことで、自分の
失敗を回避することを好む。
     ─オットー?フォン?ビスマルク


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.
Agenda


1. 本書の構成
2. アンチパターンとは
3. おわりに
4つの部
25のパターン
1.   論理設計
2.   物理設計
3.   クエリ
4.   アプリケーション
1.   論理設計
2.   物理設計
3.   クエリ
4.   アプリケーション
論理設計のアンチパターン
1.   ジェイウォーク(信号無視)
                       ざわ…ざわ…
2.   ナイーブツリー(素朴な木)
3.   IDリクワイアド(とりあえずID)
4.   キーレスエントリ(外部キー嫌い)
5.   EAV(エンティティ?アトリビュート?バリュー)
6.   ポリモーフィック関連
7.   マルチカラムアトリビュート(複数列属性)
8.   メタデータトリブル(メタデータ大増殖)
1.   論理設計
2.   物理設計
3.   クエリ
4.   アプリケーション
物理設計のアンチパターン

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

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

                        否定意見多し
11. ファントムファイル(幻のファイル)

12. インデックスショットガン(闇雲インデックス)
1.   論理設計
2.   物理設計
3.   クエリ
4.   アプリケーション
クエリのアンチパターン

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

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

                   様々な解決策
15. ランダムセレクション

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

17. スパゲッティクエリ

18. インプリシットカラム(暗黙の列)
1.   論理設計
2.   物理設計
3.   クエリ
4.   アプリケーション
アプリケーションのアンチパターン
19. リーダブルパスワード(読み取り可能パスワード)

20. SQLインジェクション

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

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

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

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

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


1. 本書の構成
2. アンチパターンとは
3. おわりに
アンチパターンとは
べからず集
あるある集
   だけでは无い!
本书のアンチパターンの构成

           名前重要!!
0.   名前
1.   目的
2.   アンチパターン
3.   アンチパターンの見つけ方
4.   アンチパターンを用いても良い場合
5.   解決策
例: ナイーブツリー
   (素朴な木)
なぜカタカナ!?
パターン名が英語そのままカタカナ表記であ
るのは、目次を見ただけではビックリするポ
イントですね。


ただ、チーム内で相談するときなどに目立つ
名前が付いているのはむしろありがたいです
し、何よりなんかカッコよくておもしろかっ
たです!
         http://d.hatena.ne.jp/moro/20130205/1360044434
アンチパターン名で議論できるようになる


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

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



http://yoshiori.github.com/blog/2013/02/10/sql-antipatterns/
実例: ナイーブツリー(素朴な木)
0.   名前
1.   目的
2.   アンチパターン
3.   アンチパターンの見つけ方
4.   アンチパターンを用いても良い場合
5.   解決策
目的: 階層構造を格納し、クエリを実行する
実例: ナイーブツリー(素朴な木)
0.   名前
1.   目的
2.   アンチパターン
3.   アンチパターンの見つけ方
4.   アンチパターンを用いても良い場合
5.   解決策
アンチパターンとは何でしょうか。それは、
問題の解決を意図しながらも、しばしば他の
問題を生じさせてしまうような技法を指しま
す。
             ─ Bill Karwin



         よかれと思って裏目
         に出てしまうもの
アンチパターン: 常に親のみに依存する

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



 親idが入る
アンチパターンにより起こること


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階層目


                     素朴すぎる故に
                     アンチパターン
実例: ナイーブツリー(素朴な木)
0.   名前
1.   目的
2.   アンチパターン
3.   アンチパターンの見つけ方
4.   アンチパターンを用いても良い場合
5.   解決策
直面している問題の種類や、メンバー間の会
話での何気ない言葉が、そこにアンチパター
ンがあるかもしれないことに気づくヒントに
なります。
             ─ Bill Karwin
アンチパターンの見つけ方

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

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

「ツリーの中で孤児になった行をきれいにす
るために、定期的にスクリプトを実行しなけ
れば」
実例: ナイーブツリー(素朴な木)
0.   名前
1.   目的
2.   アンチパターン
3.   アンチパターンの見つけ方
4.   アンチパターンを用いても良い場合
5.   解決策
アンチパターンを用いても良い場合
共通テーブル式(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;
アンチパターンを用いても良い場合

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




http://yojik.hatenablog.jp/entry/2013/02/13/235729
実例: ナイーブツリー(素朴な木)
0.   名前
1.   目的
2.   アンチパターン
3.   アンチパターンの見つけ方
4.   アンチパターンを用いても良い場合
5.   解決策
解決策: 代替ツリーモデルを使用する
             策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      了解。修正したよ。
解決策: 代替ツリーモデルを使用する

2. 入れ子集合
NestedSet




            3. 閉包テーブル
            Closure Table
解決策: 代替ツリーモデルを使用する

              解決策の比較表
         テーブ 子へのクエ ツリーへの               参照整合性
 設計                        挿入    削除
         ル数   リ実行 クエリ実行                  維持

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


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


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


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


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


1. 本書の構成
2. アンチパターンとは
3. おわりに
アンチパターンを共有しよう!
この本の素晴らしいところは、よく
見る「悪い」方法を「悪いこと」
としてまとめてくれたことです。
    http://bleis-tift.hatenablog.com/entry/2013/02/14/SQLアンチパターン




     この問題!
 進研ゼミでやったところだ!
                   http://yojik.hatenablog.jp/entry/2013/02/13/235729
Developers
    Summit

               アンチパターンを共有しよう!
N E X T 	
 ? A C T I O N !




? 経験した失敗に、名前、目的、アンチパター
    ン(裏目に出た方法)、その見つけ方などを考
    えてみよう。
? 「どうすればよかったか」を考えてみよう。
? それを共有しよう!


                             Developers Summit 2013 Action !
                                                               39
ご清聴ありがとうございました

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

More Related Content

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