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
94
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
54
PHPでWebSocketサーバーを実装しよう2025
kubotak
0
2.1k
情報漏洩させないための設計
kubotak
6
3.1k
Svelteコンポーネントの依存関係に秩序を〜
kubotak
0
230
DMARCレポート可視化ツールを SvelteKitで作った話
kubotak
2
660
Superforms本番投入で分かった良さとハマりどころ
kubotak
0
1.1k
Storybookを書くだけでリグレッションテストが 実行される世界へようこそ
kubotak
31
12k
(うまくいった||いかなかった) 技術選定は何を考えていたか
kubotak
1
1.5k
ウォーターフォールに思えたプロジェクトにあったアジャイルの要素
kubotak
2
1k
Other Decks in Programming
See All in Programming
PHPで使える日時の表現と、その知り方 #frontend_phpcon_do
o0h
PRO
0
260
エンジニア向け会社紹介/Findy Company Profile
findyinc
6
350k
ローカルLLMでどこまでコードが書けるか -拡張版 / How much code can be written on a local LLM Extended
kishida
11
4.3k
Inside Stream API
skrb
1
750
ふつうのFeature Flag実践入門
irof
8
4.1k
脅威をエンジニアリングの糧にして――現場編 / Turning Threats into Engineering Fuel — Field Edition
nrslib
0
290
Lessons from Spec-Driven Development
simas
PRO
0
220
Honoでのサプライチェーン侵害対策 〜 3つのライブラリに学ぶ
yusukebe
7
1.4k
AIを活用したE2Eテスト実装効率化のあゆみ / ebisu-mobile-14-kotetu
kotetuco
0
130
Performance Engineering for Everyone
elenatanasoiu
0
200
エンジニアと一緒にテストコードの設計と実装を改善した話
mototakatsu
0
210
Javaの型とAI時代に型が大事な理由 / java types and type in AI era
kishida
2
150
Featured
See All Featured
Deep Space Network (abreviated)
tonyrice
0
210
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
440
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
440
Balancing Empowerment & Direction
lara
6
1.2k
Art, The Web, and Tiny UX
lynnandtonic
304
22k
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
0
540
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
360
Documentation Writing (for coders)
carmenintech
77
5.4k
The Illustrated Children's Guide to Kubernetes
chrisshort
51
52k
Chasing Engaging Ingredients in Design
codingconduct
0
220
Typedesign – Prime Four
hannesfritz
42
3.1k
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
210
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クラウド 終 おわり