Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Laravelにはdeleted_atがありますけど?
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
kubotak
February 25, 2026
Programming
120
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
僕も、PHPフレームワーク作ってみた
kubotak
0
300
ハーネスエンジニアリング白書
kubotak
0
160
PHPでWebSocketサーバーを実装しよう2025
kubotak
0
2.6k
情報漏洩させないための設計
kubotak
6
3.3k
Svelteコンポーネントの依存関係に秩序を〜
kubotak
0
250
DMARCレポート可視化ツールを SvelteKitで作った話
kubotak
2
720
Superforms本番投入で分かった良さとハマりどころ
kubotak
0
1.1k
Storybookを書くだけでリグレッションテストが 実行される世界へようこそ
kubotak
31
12k
(うまくいった||いかなかった) 技術選定は何を考えていたか
kubotak
1
1.6k
Other Decks in Programming
See All in Programming
設計次第でAIコードの読む量は減らせる / designing-for-code-reading
minodriven
34
16k
難しいけど、読めた。- OSSの入口に立った話。
sts11142
0
150
Ghostty + Neovimで作る 透明でカッコ良い開発環境
j341nono
0
160
Starting & Sustaining Code-Based E2E Testing for Non-Coding QA Teams( #jasstniigata )
teyamagu
PRO
1
960
Unity6 URPによる海底をテーマにしたVJシステムの解説 | Unity Shader 完全に理解した 勉強会
gam0022
0
350
Herb in Rails 8.2: Your ERB views, now HTML-aware @ Rails World 2026, Austin, Texas
marcoroth
0
200
AIに “答え“を書かせるのを やめてみた
___akari11
0
110
モデルのリファクタリングが難しいと思ったら、そもそも複雑だったのはビジネス仕様だった ? / is-the-business-domain-the-real-complexity
hatsu38
0
450
The Rails Doctrine Decade
koic
2
550
phperだってパンチカードでコーディングしたい
o0h
PRO
0
260
Vue Fes Japan の “作る側”に関わってみて
naokihaba
0
140
AWSに止められる覚悟してますか?
morizo_1984
2
520
Featured
See All Featured
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
2.1k
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
620
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
300
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
570
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2.2k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
230
23k
Prompt Engineering for Job Search
mfonobong
0
500
Writing Fast Ruby
sferik
630
63k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
203
77k
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
260
Rails Girls Zürich Keynote
gr2m
96
14k
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クラウド 終 おわり