Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
SQLアンチパターンを読んでリファクタしてみた / sql-anti-pattern-refa...
Search
Genki Sano
September 28, 2022
Programming
0
630
SQLアンチパターンを読んでリファクタしてみた / sql-anti-pattern-refactored-2022
Genki Sano
September 28, 2022
Tweet
Share
More Decks by Genki Sano
See All by Genki Sano
やる気のない自分との向き合い方/How to Deal with Your Unmotivated Self
sanogemaru
2
740
リーダーになったら未来を語れるようになろう/Speak the Future
sanogemaru
0
640
ソフトウェアの複雑性と認知負荷/Software Complexity and Cognitive Load
sanogemaru
0
48
なぜスクラムはこうなったのか?歴史が教えてくれたこと/Shall we explore the roots of Scrum
sanogemaru
5
2k
ソフトウェアは捨てやすく作ろう/Let's make software easy to discard
sanogemaru
12
7.4k
スクラムチームをスケールする〜LeSS導入3ヶ月の振り返りと課題〜/scaling-the-scrum-team
sanogemaru
2
810
カオナビのチーム開発の裏側
sanogemaru
0
1.2k
Other Decks in Programming
See All in Programming
안드로이드 9년차 개발자, 프론트엔드 주니어로 커리어 리셋하기
maryang
1
110
WebRTC と Rust と8K 60fps
tnoho
2
1.9k
LLM Çağında Backend Olmak: 10 Milyon Prompt'u Milisaniyede Sorgulamak
selcukusta
0
110
Navigation 3: 적응형 UI를 위한 앱 탐색
fornewid
1
220
ZOZOにおけるAI活用の現在 ~モバイルアプリ開発でのAI活用状況と事例~
zozotech
PRO
8
5.4k
スタートアップを支える技術戦略と組織づくり
pospome
8
16k
認証・認可の基本を学ぼう前編
kouyuume
0
190
tparseでgo testの出力を見やすくする
utgwkk
1
180
Full-Cycle Reactivity in Angular: SignalStore mit Signal Forms und Resources
manfredsteyer
PRO
0
120
俺流レスポンシブコーディング 2025
tak_dcxi
14
8.4k
AIエージェントを活かすPM術 AI駆動開発の現場から
gyuta
0
350
connect-python: convenient protobuf RPC for Python
anuraaga
0
380
Featured
See All Featured
Building a Scalable Design System with Sketch
lauravandoore
463
34k
The Language of Interfaces
destraynor
162
25k
Building an army of robots
kneath
306
46k
Java REST API Framework Comparison - PWX 2021
mraible
34
9k
Fireside Chat
paigeccino
41
3.7k
Unsuck your backbone
ammeep
671
58k
VelocityConf: Rendering Performance Case Studies
addyosmani
333
24k
What's in a price? How to price your products and services
michaelherold
246
12k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
1.6k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
34k
Designing Experiences People Love
moore
143
24k
Testing 201, or: Great Expectations
jmmastey
46
7.8k
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