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
Laravelにはdeleted_atがありますけど?
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
kubotak
February 25, 2026
Programming
110
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Laravelにはdeleted_atがありますけど?
PHPerTeaNight#33-削除フラグ
kubotak
February 25, 2026
More Decks by kubotak
See All by kubotak
ハーネスエンジニアリング白書
kubotak
0
70
PHPでWebSocketサーバーを実装しよう2025
kubotak
0
2.2k
情報漏洩させないための設計
kubotak
6
3.1k
Svelteコンポーネントの依存関係に秩序を〜
kubotak
0
240
DMARCレポート可視化ツールを SvelteKitで作った話
kubotak
2
680
Superforms本番投入で分かった良さとハマりどころ
kubotak
0
1.1k
Storybookを書くだけでリグレッションテストが 実行される世界へようこそ
kubotak
31
12k
(うまくいった||いかなかった) 技術選定は何を考えていたか
kubotak
1
1.5k
ウォーターフォールに思えたプロジェクトにあったアジャイルの要素
kubotak
2
1k
Other Decks in Programming
See All in Programming
【やさしく解説 設計編・中級 #6】良いアーキテクチャとは ~ 一本の登り道の、行き先 ~
panda728
PRO
0
160
壊れたパーサから始める関数型設計と構成的なパーサ #fp_matsuri
raiga0310
2
210
コーディングルールの鮮度を保ちたい for SRE NEXT 2026 / keep-fresh-go-internal-conventions-sre-next-2026
handlename
0
140
JAWS-UG横浜 #102 AWSサ終供養LT会 成仏できない AWS サービスたち 〜本日、三体供養します〜
maroon1st
0
180
PHPだって関数型したい 〜できること、できないこと〜 / fp-in-php
jsoizo
0
210
ビデオ通話が繋がる0.2秒で何が起きているのか
supurazako
2
150
PHP初心者セッション2026 〜生成AIでは見えない裏側を知る:今だからLAMPを通して仕組みを学ぶ〜
kashioka
0
370
Prismを使った型安全な暗号化_関数型まつり2026
_fhhmm
0
130
Creating Composable Callables in Contemporary C++
rollbear
0
210
Even G2とAWSで推しのエージェントを召喚しよう!
har1101
1
170
信頼性について考えてみる(SRE NEXT 2026 miniLT)
hayama17
0
190
なぜ関数型プログラミングで「型」と「証明」が語られるのか #fp_matsuri
kajitack
3
910
Featured
See All Featured
Producing Creativity
orderedlist
PRO
348
40k
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
470
Become a Pro
speakerdeck
PRO
31
6k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
55k
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
610
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
270
Technical Leadership for Architectural Decision Making
baasie
3
440
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.5k
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
260
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.5k
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.3k
Transcript
Copyright© M&Aクラウド Laravelには deleted_atがありますけど? PHPerTeaNight#33「削除フラグ」 kubotak_public/Kenjiro Kubota
Copyright© M&Aクラウド Laravelのdeleted_atとは
Copyright© M&Aクラウド SoftDelete(論理削除)とは • レコードをDBから物理的に削除せず、deleted_atカラムに削除⽇時を セットすることで「削除済み」とみなす⼿法 • deleted_at IS NULL
のレコードだけが通常のクエリ対象になる
Copyright© M&Aクラウド Laravelでの使い⽅
Copyright© M&Aクラウド Laravelでの使い⽅
Copyright© M&Aクラウド withTrashedの注意点 • リレーション先がSoftDelete済みだとnullが返る → withTrashed()を明⽰的に付 ける必要がある
Copyright© M&Aクラウド deleted_atの罠
Copyright© M&Aクラウド 1. データ抽出でのうっかりミス • LaravelのEloquentは⾃動でWHERE deleted_at IS NULLを付与してくれる •
しかし⽣SQL‧バッチ処理‧BIツール‧データ分析ではこの⾃動フィルタが効か ない • 「退会済みユーザーのデータを含めて集計してしまった」事故が起こりうる
Copyright© M&Aクラウド 2. 削除の定義が曖昧 • deleted_atは「何らかの理由で無効化された」ことしか表現できない。実際の業 務では削除の理由は多様
Copyright© M&Aクラウド 3. DBパフォーマンスの問題 • カーディナリティ = カラム値の「ユニークさ」の度合い • deleted_atは⼤半がNULL(99%以上がアクティブなレコード)→
極めて低い カーディナリティ • MySQLのオプティマイザは低カーディナリティのインデックスを無視することが ある
Copyright© M&Aクラウド 3. DBパフォーマンスの問題 バッファプールの浪費 • InnoDB はよく使うデータページをメモリ 上のバッファプールにキャッシュする •
論理削除されたレコードも物理的にはテー ブルに残るため、同じデータページに削除 済み‧未削除のレコードが混在する • 結果、削除済みレコードまでバッファプー ルに載ってしまい、本当に必要なデータの キャッシュヒット率が低下する
Copyright© M&Aクラウド 4. ユニーク制約の問題 • accound_nameやemail_addressカラム等がユニーク制約である場合、削除済み ユーザーのレコードが残っていると新規で登録ができない
Copyright© M&Aクラウド ⾮機能要件としての削除
Copyright© M&Aクラウド データ復旧の必要性 • 「誤って削除したデータを元に戻したい」→ SoftDeleteの正当なユース ケース ◦ ただし「どのくらいの期間復旧可能にするか」も決めるべき •
無期限に残すとデータが膨らみ続ける
Copyright© M&Aクラウド コンプライアンス(GDPR / 個⼈情報保護法) • ⼀般データ保護規則(GDPR) 第17条「忘れられる権利(Right to Erasure)」
で は、個⼈データの削除を請求された場合、不当な遅延なく消去する義務がある • 論理削除(deleted_atをセット)だけではGDPR上の「消去」とみなされない可 能性がある ◦ DBにデータが残っている = 個⼈データを保持している • 対応パターン: ◦ 物理削除 + バックアップからも⼀定期間で消去 ◦ 個⼈データの匿名化(email = '
[email protected]
') ◦ 暗号化キーの破棄による暗号学的消去(Crypto-shredding) https://www.ppc.go.jp/files/pdf/gdpr-provisions-ja.pdf
Copyright© M&Aクラウド 関連データの削除 • 物理削除であればCASCADEで関連データを削除やnull対応が⾏える • 論理削除の場合はプログラマブルに対応する必要がある
Copyright© M&Aクラウド データ量の問題 • 論理削除は、パージ運⽤(forceDelete等)を設けないとレコードが増 え続ける • 数年運⽤すると「テーブルの多くが削除済みレコード」という状態にな りうる •
ALTER TABLEやマイグレーションの実⾏時間にも影響する
Copyright© M&Aクラウド じゃあ、どうしたらいいの?
Copyright© M&Aクラウド パターン1: アーカイブテーブルへの退避 そーだいさんの「失敗から学ぶRDBの正しい歩き⽅」でも推奨されているアプロー チ。 削除フラグで状態管理するのではなく、別テーブルに移すという考え⽅。
Copyright© M&Aクラウド パターン1: アーカイブテーブルへの退避 「退会ユーザー」と「アクティブユーザー」は別の概念であることを意識してテーブ ルを分けることが重要 既存の削除フラグをリファクタリングする際のDouble-Writeパターン(新旧テーブル に同時書き込みしながら段階的に移⾏)が良い https://soudai.hatenablog.com/entry/database-refactoring-double-write https://soudai.hatenablog.com/entry/2018/05/01/204442
Copyright© M&Aクラウド パターン1: アーカイブテーブルへの退避 メリット: • 本テーブルのパフォーマンスが劣化しない • 復旧も可能(アーカイブから本テーブルに戻す) •
集計時に削除済みデータが混⼊するリスクがない • ドメインモデルとして「削除済み」が明⽰的に表現される デメリット: • スキーマ変更時にアーカイブテーブルも同期が必要 • 参照整合性の管理が複雑になる
Copyright© M&Aクラウド パターン2: 状態カラムの導⼊
Copyright© M&Aクラウド パターン2: 状態カラムの導⼊ メリット: • 「なぜ無効化されたか」が明確 • ステータスごとの集計やフィルタリングが容易 •
ビジネスロジックとして表現⼒が⾼い デメリット: • LaravelのSoftDeletesの恩恵(⾃動フィルタ等)が使えない • グローバルスコープを⾃前で実装する必要がある • いつステータスが更新されたか、という情報が失われる ◦ status_updated_atとか‧‧‧???
Copyright© M&Aクラウド パターン3: 物理削除 + 監査ログ
Copyright© M&Aクラウド パターン3: 物理削除 + 監査ログ メリット: • 本テーブルはクリーンな状態を維持 •
「誰が‧いつ‧何を削除したか」の追跡が可能 • GDPR対応の設計がしやすい(物理削除 + ログ匿名化/保持期限管理) デメリット: • 復旧がやや⼿間(ログからリストアするロジックが必要) • ログテーブル⾃体のデータ量管理が必要
Copyright© M&Aクラウド パターン4: イベントソーシング • すべての状態変更を「イベント」として記録し、現在の状態はイベント の積み重ねで再現する • 削除も「DeletedEvent」として記録される •
任意の時点の状態を再現可能
Copyright© M&Aクラウド パターン4: イベントソーシング メリット: • 完全な変更履歴 • 削除の取り消しが⾃然に実現できる デメリット:
• 学習コスト‧実装コストが⾼い • 既存システムへの導⼊はハードルが⾼い ◦ そもそもPHPで実装するの???^^????
Copyright© M&Aクラウド まとめ
Copyright© M&Aクラウド 総括 • 論理削除は「とりあえず」で使いがちだが、多くの場合で問題を先送り にしているだけ • 削除の要件を明確にしてから⼿法を選ぶべき ◦ なぜ削除するのか?
◦ 復旧は必要か?期間は? ◦ コンプライアンス要件は? ◦ データ量の⾒通しは? • LaravelにSoftDeletesがあるからといって、思考停⽌で使わない • 適切な⼿法を選択し、将来のメンテナンスコストを下げよう
Copyright© M&Aクラウド 終 おわり