Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
SQLアンチパターンを読んでリファクタしてみた
Search
Genki Sano
September 28, 2022
Programming
0
650
SQLアンチパターンを読んでリファクタしてみた
Genki Sano
September 28, 2022
Tweet
Share
More Decks by Genki Sano
See All by Genki Sano
社外コミュニティの歩き方
sanogemaru
0
2
EMの透明性はどう作られるのか ―社内ラジオを続けて分かったこと
sanogemaru
1
220
薪ストーブへの憧れ
sanogemaru
0
63
やる気のない自分との向き合い方
sanogemaru
2
890
リーダーになったら未来を語れるようになろう
sanogemaru
0
780
ソフトウェアの複雑性と認知負荷
sanogemaru
0
65
なぜスクラムはこうなったのか?歴史が教えてくれたこと
sanogemaru
5
2.4k
ソフトウェアは捨てやすく作ろう
sanogemaru
12
7.6k
スクラムチームをスケールする〜LeSS導入3ヶ月の振り返りと課題〜
sanogemaru
2
870
Other Decks in Programming
See All in Programming
Rethinking API Platform Filters
vinceamstoutz
0
150
車輪の再発明をしよう!PHP で実装して学ぶ、Web サーバーの仕組みと HTTP の正体
h1r0
2
360
Nostalgia Meets Technology: Super Mario with TypeScript
manfredsteyer
PRO
0
110
AI時代のシステム設計:ドメインモデルで変更しやすさを守る設計戦略
masuda220
PRO
6
1.1k
Codex の「自走力」を高める
yorifuji
0
1.3k
Pythonデータ分析コトハジメinFukuoka
kanan
0
100
PHPで TLSのプロトコルを実装してみる
higaki_program
0
420
エンジニアの「手元の自動化」を加速するn8n 2026.02.27
symy2co
0
180
Vuetify 3 → 4 何が変わった?差分と移行ポイント10分まとめ
koukimiura
0
180
Claude Codeログ基盤の構築
giginet
PRO
7
3.6k
Takumiから考えるSecurity_Maturity_Model.pdf
gessy0129
1
160
Kubernetesでセルフホストが簡単なNewSQLを求めて / Seeking a NewSQL Database That's Simple to Self-Host on Kubernetes
nnaka2992
0
180
Featured
See All Featured
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
75
AI: The stuff that nobody shows you
jnunemaker
PRO
3
470
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
231
22k
How Software Deployment tools have changed in the past 20 years
geshan
0
33k
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
250
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
0
220
The Curious Case for Waylosing
cassininazir
0
280
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.2k
The SEO Collaboration Effect
kristinabergwall1
0
400
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
320
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
110
Designing for Performance
lara
611
70k
Transcript
佐野 元気 SQLアンチパターンを読んで リファクタしてみた @kaonaviTechTalk #9 2022/09/28
自己紹介 @sanogemaru 2 株式会社カオナビ バックエンドエンジニア エンジニアリングマネージャー 佐野 元気 Genki
Sano
3 SQLアンチパターン 呼んだことありますか?
4 SQLアンチパターン 呼んだことありますか? (ありますよね?)
5 Bill Karwin(著). 和田 卓人, 和田 省二(監訳). 児島 修(訳) 『SQLアンチパターン』.
オライリー・ジャパン. 2013年, 352ページ
6 自分で設計したものが アンチパターンに該当したので リファクタリングしてみた話
アジェンダ 1. 今回の開発内容 2. 修正前のテーブル構成 3. アンチパターンになった箇所 4. 何が問題なのか 5.
修正後のテーブル構成 6. 発生した問題点 7. まとめ 7
1.今回の開発内容 8
1.今回の開発内容 9 • 開発する機能 ◦ グラフの作成機能 • 概要 ◦ とあるタレントマネジメントシステムにおける機能追加
◦ 横軸と系列に対して、値を指定することで登録されているデータを マッピングする
1.今回の開発内容 10
1.今回の開発内容 11 横軸項目 系列項目
2.修正前のテーブル構成 12
2.修正前のテーブル構成 13
2.修正前のテーブル構成 14
2.修正前のテーブル構成 15 column type comment id int(10) series_item_id int(10) 系列項目ID
series_item_type tinyint(3) 系列項目タイプ(1:所属、2:マスター) x_axis_item_id int(10) 横軸項目ID x_axis_item_type tinyint(3) 横軸項目タイプ(1:所属、2:マスター) ※一部のカラムのみ抜粋
2.修正前のテーブル構成 16 column type comment id int(10) series_item_id int(10) 系列項目ID
series_item_type tinyint(3) 系列項目タイプ(1:所属、2:シート項目) x_axis_item_id int(10) 横軸項目ID x_axis_item_type tinyint(3) 横軸項目タイプ(1:所属、2:マスター) ※一部のカラムのみ抜粋 所属の集計は 所属グループID マスターの集計は シート項目ID 所属の集計は 所属グループID マスターの集計は シート項目ID
3.アンチパターンになった箇所 17
3.アンチパターンになった箇所 どこが該当しそうなのか? • 5章:EAV(エンティティ・アトリビュート・バリュー) • 6章:ポリモーフィック関連 18
3.アンチパターンになった箇所 5章:EAV(エンティティ・アトリビュート・バリュー) 可変属性を表現するために attr_name と attr_value を持つテーブルを作成する 19 issue_id attr_name
attr_value 1234 status FAILED 1234 description 保存処理に失敗する 1235 status SUCCESS 1235 description 保存処理に成功する
3.アンチパターンになった箇所 6章:ポリモーフィック関連 1つのモデルに対して複数のモデルを関連させるために、typeとidを持つ 20
3.アンチパターンになった箇所 もう一度、今回の該当テーブルを確認する 21
3.アンチパターンになった箇所 22 column type comment id int(10) series_item_id int(10) 系列項目ID
series_item_type tinyint(3) 系列項目タイプ(1:所属、2:シート項目) x_axis_item_id int(10) 横軸項目ID x_axis_item_type tinyint(3) 横軸項目タイプ(1:所属、2:マスター) ※一部のカラムのみ抜粋 所属の集計は 所属グループID マスターの集計は シート項目ID 所属の集計は 所属グループID マスターの集計は シート項目ID
3.アンチパターンになった箇所 一つのモデルに対して複数のモデルを関連させようとしており 6章:ポリモーフィック関連 が該当している様子 23
4.何が駄目なのか 24
4.何が問題なのか 25 結論から言うと、外部キー制約を定義できない こと
4.何が問題なのか 26 結論から言うと、外部キー制約を定義できない こと → 4章:キーレスエントリ(外部キー嫌い)に該当
4.何が問題なのか 27 結論から言うと、外部キー制約を定義できない こと → 4章:キーレスエントリ(外部キー嫌い)に該当 • 参照整合性をアプリケーションで再実装する必要がある • 壊れた参照をどうするかという問題が生じる
• アドホックなSQLによって壊れる
5.修正後のテーブル構成 28
5.修正後のテーブル構成 29
5.修正後のテーブル構成 30 交差テーブル
5.修正後のテーブル構成 31 column type comment chart_id int(10) グラフID sheet_item_id int(10)
シート項目ID column type comment chart_id int(10) グラフID department_group_id int(10) 所属グループID グラフ系列シート項目/グラフ横軸シート項目 グラフ系列所属グループ/グラフ系列所属グループ
6.発生した問題点 32
6.発生した問題点 33 問題となったのは以下の1点 • 排他の制御が出来ない
6.発生した問題点 34 排他の制御が出来ない 「どちらか一方にしかレコードが入ってほしくない」のを制御できない
6.発生した問題点 35 排他の制御が出来ない 「どちらか一方にしかレコードが入ってほしくない」のを制御できない
6.発生した問題点 36 排他の制御が出来ない 「どちらか一方にしかレコードが入ってほしくない」のを制御できない どちらか一方にだけ、レコードを保持したい
6.発生した問題点 37 排他の制御が出来ない 「どちらか一方にしかレコードが入ってほしくない」のを制御できない どちらか一方にしかレコードが入らないようにし たい場合、アプリでの制御が必要
7.まとめ 38
7.まとめ 39 Q:結局はどういう風な構成で実装していくのか?
7.まとめ 40 Q:結局はどういう風な構成で実装していくのか? A:修正前のままの構成で実装予定
41 えっ!?
7.まとめ 42 Q:どうしてそのままにしたのか?
7.まとめ 43 Q:どうしてそのままにしたのか? A:以下の2点が理由 • Eloquent Model でポリモーフィック関連をサポートしている • アプリケーションでの制御がしんどい
7.まとめ 44 Eloquent Model でポリモーフィック関連をサポートしている > Eloquentはそうしたリレーションを簡単に管理し操作できるようにする > とともに、さまざまなタイプのリレーションをサポートしています。 Laravel
6.x Eloquent:リレーション
7.まとめ 45 アプリケーションでの制御がしんどい 結局、排他の制御などはアプリ側で実装する必要がある データベース側で参照整合性がそこまで担保できないので、実装が楽な方で いいのでは?と考えた
7.まとめ 46 ご相談・ご指摘・その他 下記のTwitterアカウントまでお願いします! @sanogemaru