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
680
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
SQLアンチパターンを読んでリファクタしてみた
Genki Sano
September 28, 2022
More Decks by Genki Sano
See All by Genki Sano
社外コミュニティの歩き方
sanogemaru
0
73
VSCode中心だった自分がターミナル沼に入門した話
sanogemaru
0
1.3k
EMの透明性はどう作られるのか ―社内ラジオを続けて分かったこと
sanogemaru
1
520
薪ストーブへの憧れ
sanogemaru
0
100
やる気のない自分との向き合い方
sanogemaru
2
1k
リーダーになったら未来を語れるようになろう
sanogemaru
0
910
ソフトウェアの複雑性と認知負荷
sanogemaru
0
87
なぜスクラムはこうなったのか?歴史が教えてくれたこと
sanogemaru
5
2.7k
ソフトウェアは捨てやすく作ろう
sanogemaru
12
7.8k
Other Decks in Programming
See All in Programming
20260623_Loop Engineeringで自分の分身の問い合わせBotを作る
ryugen04
0
220
Haskell/Servantを通してWebミドルウェアを捉え直す
pizzacat83
1
590
LaravelLive Japan の裏方のすべて — 第188回 PHP勉強会@東京 (2026-06-24)
suguruooki
2
150
Honoでのサプライチェーン侵害対策 〜 3つのライブラリに学ぶ
yusukebe
7
1.9k
AIキャラアプリkaiwaの低遅延音声通話基盤をどう作ったか - AWS Gravitonで支える低遅延・低コストAI Agent基盤
mogamit
0
170
エンジニア向け会社紹介/Findy Company Profile
findyinc
6
360k
これからAgentCoreを触る方へトレンドはGatewayです
har1101
6
500
Terraform標準の組織で AWS CDKをどう使うか
mu7889yoon
0
290
1B+ /day規模のログを管理する技術
broadleaf
0
140
分散システム、なんですぐ死んでしまうん?耐障害性を高めたいあなたのためのレジリエンスパターン入門
mshibuya
7
6.4k
AI がコードを書く時代における新卒エンジニアの仕事風景 (2026) / New Graduate Engineers in the Era of AI Coding (2026)
sushichan044
0
220
SLOをサービス品質の共通言語にするために 取り組んできたこと
wakana0222
0
510
Featured
See All Featured
4 Signs Your Business is Dying
shpigford
187
22k
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
390
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
410
Heart Work Chapter 1 - Part 1
lfama
PRO
8
36k
Practical Orchestrator
shlominoach
191
11k
Art, The Web, and Tiny UX
lynnandtonic
304
22k
How to build a perfect <img>
jonoalderson
1
5.8k
Evolving SEO for Evolving Search Engines
ryanjones
0
240
Between Models and Reality
mayunak
4
370
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.4k
What does AI have to do with Human Rights?
axbom
PRO
1
2.3k
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
290
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