O slideshow foi denunciado.
Utilizamos seu perfil e dados de atividades no LinkedIn para personalizar e exibir anúncios mais relevantes. Altere suas preferências de anúncios quando desejar.
ジェイウォーク
SQLアンチパターンその1
信 号 無 視
ジェイウォーク
is
単一列に複数の値を格納するSQLアンチパターン
シナリオ
 A「ブログに、共同編集機能付けたいんよ」
 B「はい」
 A「今一人しか編集できないじゃん?」
 B「ですね」
 A「複数人がいじれるように出来ない?」
 B「考えてみます」
シナリオ
 B「今のテーブル定義こんな感じだから」
id title author_id
1 俺のブログ 10000
2 私のブログ 20000
シナリオ
 B「要はauthorをn人に出来ればいい訳で」
id title author_id
1 俺のブログ 10000
2 私のブログ 20000
シナリオ
 B「こうすればいいか」
id title author_id
1 俺のブログ 10000,10001,10002
2 私のブログ 20000,10001,10002
シナリオ
 B「こうすればいいか」
id title author_id
1 俺のブログ 10000,10001,10002
2 私のブログ 20000,10001,10002
信 号 無 視
ジェイウォーク
Bの主張
 既存のテーブル定義でそのまま実現可能で
すしお手軽ですよね
 挿入も文字列連結するだけだし、実装コス
トも低いですしね。
Bの主張
 既存のテーブル定義でそのまま実現可能で
すしお手軽ですよね
 データの妥当性の担保は?
 挿入も文字列連結するだけだし、実装コス
トも低いですしね。
 検索は?更新は?削除は?
ジェイウォーク選択のデメリット
 効率的な検索が出来なくなる
 あるユーザが編集権を持っているブログは?
 あるブログの編集権があるユーザ情報は?
 正規表現?
 パターンマッチ(like)?
 いずれにせよindexが効かなくなる...
ジェイウォーク選択のデメリット
 更新がつらい
 あるユーザのみ編集権を削除するには?
 参照
 アプリ側でsplit
 削除IDの検索、リストから削除
 再更新
ジェイウォーク選択のデメリット
1,2,3
ジェイウォーク選択のデメリット
1,2,3 1 2 3
split
ジェイウォーク選択のデメリット
1,2,3 1 2 3 1 3
split remove
ジェイウォーク選択のデメリット
1,2,3 1 2 3 1 3 1,2
split remove implode
ジェイウォーク選択のデメリット
1,2,3 1 2 3 1 3 1,2
split remove implode
だるい
ジェイウォーク選択のデメリット
 参照整合性の維持もできないですし。
ジェイウォーク選択のデメリット
 共同編集者の最大人数は何人ですか?
 author_idカラムの定義に依存します!
 varchar(128)に保存できる限り保存できます!
 idが若い(桁数が少ない)と沢山保存できますが
老番(桁数...
ジェイウォーク選択のデメリット
 まとめ
 参照が死ぬ
 更新が死ぬ
 妥当性検査、参照整合性が死ぬ
 仕様変更で死ぬ
B「僕は…どうしたらよかったんだ…」
解決策
 交差テーブルを使いましょう
 2つのテーブルを参照する外部キーを持つテー
ブルのこと
 blogテーブルとusersテーブルの間にもう一つ
テーブルを作る
解決策
id title
1 俺のブログ
2 私のブログ
blog_id user_id
1 10000
1 10001
1 10002
2 20000
2 10001
2 10002
id name
10000 太郎
10001 一郎
100...
解決策 : 交差テーブル
 参照で死なない
 シンプルなクエリ、indexも利用できる
 集約関数も利用できる(countとか)
 更新で死なない
 素直にupdate, insert, deleteするだけ
 妥当性検査、参照整合...
解決策 : 交差テーブル
id title
1 俺のブログ
2 私のブログ
blog_id user_id
1 10000
1 10001
1 10002
2 20000
2 10001
2 10002
id name
10000 太郎
100...
解決策 : 交差テーブル
id title
1 俺のブログ
2 私のブログ
blog_id user_id
1 10000
1 10001
1 10002
2 20000
2 10001
2 10002
id name
10000 太郎
100...
解決策 : 交差テーブル
id title
1 俺のブログ
2 私のブログ
blog_id user_id
1 10000
1 10001
1 10002
2 20000
2 10001
2 10002
id name
10000 太郎
100...
シンプル!
ジェイウォーク(信号無視)
 jaywalk 【自動】〈話〉
 〔交通規則を無視して〕道路を横断する、横断
歩道のないところを横切る
 ◆【語源】jay(不注意な人)から。
 交差点(交差テーブル)を避ける所から命名
 面倒だからと信...
アンチパターンを用いていい場合
 リストの各要素への個別アクセスが存在し
ない、かつパフォーマンスの為にあえて非
正規化を選択する場合
 個別要素へのアクセスがなければ検索性は犠牲
にしても問題ない
 csvが欲しい等の場合、最初からカン...
おわり
Próximos SlideShares
Carregando em…5
×

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

17.743 visualizações

Publicada em

社内勉強会資料

Publicada em: Tecnologia
  • 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,
       Responder 
    Tem certeza que deseja  Sim  Não
    Insira sua mensagem aqui

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. おわり

×