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アンチパターンその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が欲しい等の場合、最初からカン...
おわり
Upcoming SlideShare
Loading in …5
×

of

SQLアンチパターン - ジェイウォーク Slide 1 SQLアンチパターン - ジェイウォーク Slide 2 SQLアンチパターン - ジェイウォーク Slide 3 SQLアンチパターン - ジェイウォーク Slide 4 SQLアンチパターン - ジェイウォーク Slide 5 SQLアンチパターン - ジェイウォーク Slide 6 SQLアンチパターン - ジェイウォーク Slide 7 SQLアンチパターン - ジェイウォーク Slide 8 SQLアンチパターン - ジェイウォーク Slide 9 SQLアンチパターン - ジェイウォーク Slide 10 SQLアンチパターン - ジェイウォーク Slide 11 SQLアンチパターン - ジェイウォーク Slide 12 SQLアンチパターン - ジェイウォーク Slide 13 SQLアンチパターン - ジェイウォーク Slide 14 SQLアンチパターン - ジェイウォーク Slide 15 SQLアンチパターン - ジェイウォーク Slide 16 SQLアンチパターン - ジェイウォーク Slide 17 SQLアンチパターン - ジェイウォーク Slide 18 SQLアンチパターン - ジェイウォーク Slide 19 SQLアンチパターン - ジェイウォーク Slide 20 SQLアンチパターン - ジェイウォーク Slide 21 SQLアンチパターン - ジェイウォーク Slide 22 SQLアンチパターン - ジェイウォーク Slide 23 SQLアンチパターン - ジェイウォーク Slide 24 SQLアンチパターン - ジェイウォーク Slide 25 SQLアンチパターン - ジェイウォーク Slide 26 SQLアンチパターン - ジェイウォーク Slide 27 SQLアンチパターン - ジェイウォーク Slide 28 SQLアンチパターン - ジェイウォーク Slide 29 SQLアンチパターン - ジェイウォーク Slide 30
Upcoming SlideShare
アナザーエデンにおける非同期オートセーブを用いた通信待ちストレスのないゲーム体験の実現
Next
Download to read offline and view in fullscreen.

30 Likes

Share

Download to read offline

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

Download to read offline

社内勉強会資料

Related Books

Free with a 30 day trial from Scribd

See all

Related Audiobooks

Free with a 30 day trial from Scribd

See all

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

    Jun. 24, 2019
  • aabbcc001122

    Nov. 5, 2017
  • hiroyukinagata16503

    Aug. 24, 2017
  • yuuiti

    Aug. 14, 2016
  • norotime

    Aug. 15, 2015
  • yuichitakada88

    Jun. 2, 2015
  • kmiyakita

    Feb. 4, 2015
  • takushimizu

    May. 8, 2014
  • hironobuu

    Nov. 28, 2013
  • MikioNozaki

    Nov. 11, 2013
  • SoraNyasukE

    Oct. 8, 2013
  • TakeshiWatanabe2

    Oct. 7, 2013
  • haru01

    Oct. 5, 2013
  • lajixinxi

    Oct. 4, 2013
  • shimabukuro

    Oct. 4, 2013
  • ssuser429067

    Oct. 2, 2013
  • nekogeruge_987

    Oct. 2, 2013
  • jk-white045

    Oct. 2, 2013
  • kazp3

    Oct. 2, 2013
  • junichimurata1978

    Oct. 2, 2013

社内勉強会資料

Views

Total views

23,917

On Slideshare

0

From embeds

0

Number of embeds

5,620

Actions

Downloads

58

Shares

0

Comments

0

Likes

30

×