Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

SQLアンチパターン - ジェイウォーク

17,700 views

Published on

社内勉強会資料

Published in: Technology
  • DOWNLOAD THIS BOOKS INTO AVAILABLE FORMAT (Unlimited) ......................................................................................................................... ......................................................................................................................... Download Full PDF EBOOK here { https://tinyurl.com/yyxo9sk7 } ......................................................................................................................... Download Full EPUB Ebook here { https://tinyurl.com/yyxo9sk7 } ......................................................................................................................... ACCESS WEBSITE for All Ebooks ......................................................................................................................... Download Full PDF EBOOK here { https://tinyurl.com/yyxo9sk7 } ......................................................................................................................... Download EPUB Ebook here { https://tinyurl.com/yyxo9sk7 } ......................................................................................................................... Download doc Ebook here { https://tinyurl.com/yyxo9sk7 } ......................................................................................................................... ......................................................................................................................... ......................................................................................................................... .............. Browse by Genre Available eBooks ......................................................................................................................... Art, Biography, Business, Chick Lit, Children's, Christian, Classics, Comics, Contemporary, Cookbooks, Crime, Ebooks, Fantasy, Fiction, Graphic Novels, Historical Fiction, History, Horror, Humor And Comedy, Manga, Memoir, Music, Mystery, Non Fiction, Paranormal, Philosophy, Poetry, Psychology, Religion, Romance, Science, Science Fiction, Self Help, Suspense, Spirituality, Sports, Thriller, Travel, Young Adult,
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

SQLアンチパターン - ジェイウォーク

  1. 1. ジェイウォーク SQLアンチパターンその1 信 号 無 視
  2. 2. ジェイウォーク is 単一列に複数の値を格納するSQLアンチパターン
  3. 3. シナリオ  A「ブログに、共同編集機能付けたいんよ」  B「はい」  A「今一人しか編集できないじゃん?」  B「ですね」  A「複数人がいじれるように出来ない?」  B「考えてみます」
  4. 4. シナリオ  B「今のテーブル定義こんな感じだから」 id title author_id 1 俺のブログ 10000 2 私のブログ 20000
  5. 5. シナリオ  B「要はauthorをn人に出来ればいい訳で」 id title author_id 1 俺のブログ 10000 2 私のブログ 20000
  6. 6. シナリオ  B「こうすればいいか」 id title author_id 1 俺のブログ 10000,10001,10002 2 私のブログ 20000,10001,10002
  7. 7. シナリオ  B「こうすればいいか」 id title author_id 1 俺のブログ 10000,10001,10002 2 私のブログ 20000,10001,10002 信 号 無 視 ジェイウォーク
  8. 8. Bの主張  既存のテーブル定義でそのまま実現可能で すしお手軽ですよね  挿入も文字列連結するだけだし、実装コス トも低いですしね。
  9. 9. Bの主張  既存のテーブル定義でそのまま実現可能で すしお手軽ですよね  データの妥当性の担保は?  挿入も文字列連結するだけだし、実装コス トも低いですしね。  検索は?更新は?削除は?
  10. 10. ジェイウォーク選択のデメリット  効率的な検索が出来なくなる  あるユーザが編集権を持っているブログは?  あるブログの編集権があるユーザ情報は?  正規表現?  パターンマッチ(like)?  いずれにせよindexが効かなくなる  → 死
  11. 11. ジェイウォーク選択のデメリット  更新がつらい  あるユーザのみ編集権を削除するには?  参照  アプリ側でsplit  削除IDの検索、リストから削除  再更新
  12. 12. ジェイウォーク選択のデメリット 1,2,3
  13. 13. ジェイウォーク選択のデメリット 1,2,3 1 2 3 split
  14. 14. ジェイウォーク選択のデメリット 1,2,3 1 2 3 1 3 split remove
  15. 15. ジェイウォーク選択のデメリット 1,2,3 1 2 3 1 3 1,2 split remove implode
  16. 16. ジェイウォーク選択のデメリット 1,2,3 1 2 3 1 3 1,2 split remove implode だるい
  17. 17. ジェイウォーク選択のデメリット  参照整合性の維持もできないですし。
  18. 18. ジェイウォーク選択のデメリット  共同編集者の最大人数は何人ですか?  author_idカラムの定義に依存します!  varchar(128)に保存できる限り保存できます!  idが若い(桁数が少ない)と沢山保存できますが 老番(桁数が多い)だとあまり保存できません!
  19. 19. ジェイウォーク選択のデメリット  まとめ  参照が死ぬ  更新が死ぬ  妥当性検査、参照整合性が死ぬ  仕様変更で死ぬ
  20. 20. B「僕は…どうしたらよかったんだ…」
  21. 21. 解決策  交差テーブルを使いましょう  2つのテーブルを参照する外部キーを持つテー ブルのこと  blogテーブルとusersテーブルの間にもう一つ テーブルを作る
  22. 22. 解決策 id title 1 俺のブログ 2 私のブログ blog_id user_id 1 10000 1 10001 1 10002 2 20000 2 10001 2 10002 id name 10000 太郎 10001 一郎 10002 二郎 20000 n郎 これ PK blogs usersauthors
  23. 23. 解決策 : 交差テーブル  参照で死なない  シンプルなクエリ、indexも利用できる  集約関数も利用できる(countとか)  更新で死なない  素直にupdate, insert, deleteするだけ  妥当性検査、参照整合性で死なない  カラムの型、外部キー制約  最大編集人数とかにも変な制約はつかない  アプリで制約するのもblog_idでcountするだけ
  24. 24. 解決策 : 交差テーブル id title 1 俺のブログ 2 私のブログ blog_id user_id 1 10000 1 10001 1 10002 2 20000 2 10001 2 10002 id name 10000 太郎 10001 一郎 10002 二郎 20000 n郎 blogs usersauthors 「俺のブログ」の編集者の名前
  25. 25. 解決策 : 交差テーブル id title 1 俺のブログ 2 私のブログ blog_id user_id 1 10000 1 10001 1 10002 2 20000 2 10001 2 10002 id name 10000 太郎 10001 一郎 10002 二郎 20000 n郎 blogs usersauthors 「一郎」が編集しているブログ
  26. 26. 解決策 : 交差テーブル id title 1 俺のブログ 2 私のブログ blog_id user_id 1 10000 1 10001 1 10002 2 20000 2 10001 2 10002 id name 10000 太郎 10001 一郎 10002 二郎 20000 n郎 blogs usersauthors 「俺のブログ」から「二郎」を外す
  27. 27. シンプル!
  28. 28. ジェイウォーク(信号無視)  jaywalk 【自動】〈話〉  〔交通規則を無視して〕道路を横断する、横断 歩道のないところを横切る  ◆【語源】jay(不注意な人)から。  交差点(交差テーブル)を避ける所から命名  面倒だからと信号無視をせず、交差点を ちゃんと渡りましょう。
  29. 29. アンチパターンを用いていい場合  リストの各要素への個別アクセスが存在し ない、かつパフォーマンスの為にあえて非 正規化を選択する場合  個別要素へのアクセスがなければ検索性は犠牲 にしても問題ない  csvが欲しい等の場合、最初からカンマ区切り にしておいた方が効率が良い
  30. 30. おわり

×