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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Genki Sano
September 28, 2022
Programming
660
0
Share
SQLアンチパターンを読んでリファクタしてみた
Genki Sano
September 28, 2022
More Decks by Genki Sano
See All by Genki Sano
社外コミュニティの歩き方
sanogemaru
0
43
VSCode中心だった自分がターミナル沼に入門した話
sanogemaru
0
1.1k
EMの透明性はどう作られるのか ―社内ラジオを続けて分かったこと
sanogemaru
1
440
薪ストーブへの憧れ
sanogemaru
0
74
やる気のない自分との向き合い方
sanogemaru
2
950
リーダーになったら未来を語れるようになろう
sanogemaru
0
810
ソフトウェアの複雑性と認知負荷
sanogemaru
0
73
なぜスクラムはこうなったのか?歴史が教えてくれたこと
sanogemaru
5
2.5k
ソフトウェアは捨てやすく作ろう
sanogemaru
12
7.7k
Other Decks in Programming
See All in Programming
NakouPAY説明用
annouim0
0
170
The Less-Told Story of Socket Timeouts
coe401_
3
310
セグメントとターゲットを意識するプロポーザルの書き方 〜採択の鍵は、誰に刺すかを見極めるマーケティング戦略にある〜
m3m0r7
PRO
0
550
ハーネスエンジニアリングとは?
kinopeee
10
5.3k
Coding at the Speed of Thought: The New Era of Symfony Docker
dunglas
0
5k
煩雑なSkills管理をSoC(関心の分離)により解決する――関心を分離し、プロンプトを部品として育てるためのOSSを作った話 / Solving Complex Skills Management Through SoC (Separation of Concerns)
nrslib
4
950
Don't Prompt Harder, Structure Better
kitasuke
0
770
Liberating Ruby's Parser from Lexer Hacks
ydah
2
1.3k
Spec Driven Development | AI Summit Vilnius
danielsogl
PRO
1
100
事業会社でのセキュリティ長期インターンについて
masachikaura
0
250
Coding as Prompting Since 2025
ragingwind
0
830
PicoRuby for IoT: Connecting to the Cloud with MQTT
yuuu
2
570
Featured
See All Featured
Into the Great Unknown - MozCon
thekraken
41
2.4k
WENDY [Excerpt]
tessaabrams
10
37k
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
680
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
22k
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
130
The Cult of Friendly URLs
andyhume
79
6.8k
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
270
A Modern Web Designer's Workflow
chriscoyier
698
190k
Git: the NoSQL Database
bkeepers
PRO
432
67k
A Tale of Four Properties
chriscoyier
163
24k
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
370
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
1
2.6k
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