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,512 views

Published on

社内勉強会資料

Published in: Technology
  • Be the first to comment

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

×