テクノロジー

論理削除をやめて状態をテーブルで分けるDB設計

1: secseek 2026/05/29 13:22

これスマートな気がするんですよね。削除日時みたいに、削除テーブル側にだけ必要な列もあるでしょうし

2: yarumato 2026/05/29 18:31

“論理削除は、実際に運用していくとツラい。元を辿ると、ライフサイクルの異なる状態を 1 つのテーブルに同居させているところが原因では。 在籍中のユーザーと退会済みのユーザーでは、扱う情報も参照頻度も違う”

3: kanetann 2026/05/29 18:45

なるほどPartial Indexか

4: nekoline 2026/05/29 19:28

いいと思う

5: hasiduki 2026/05/29 19:32

論理削除は削除じゃない!!!!!RemovedXXXというエンティティに状態遷移してるんだ!!!!!!!!

6: kakei-akihiko 2026/05/29 19:48

削除済みかどうかに関係なくソートしたい場合はパフォーマンスに影響しないのかな、状態別テーブルの方。

7: glass-_-onion 2026/05/29 20:31

とても良いと思います。

8: uzuki-first 2026/05/29 20:33

“状態を判別子として外部キーに組み込んでしまうと、トリガーなしで保証できるようになります。” なるほど

9: Iridium 2026/05/29 21:19

参照している側は常に2つのテーブルを見ることになったりしないんだろうか。両側を同時に見たいというニーズが少ないのならいいんだけど。あとやはりテーブルの総数は増えるね。

10: soxandcity 2026/05/29 22:01

DBの話というよりモデリングの話では。履歴を残したいっていうのがドメインの欲求なのであれば適切にモデリングをする。そうするとDBは自然に決まる。それをサボると辛いのはそりゃそうである。

11: shikiarai 2026/05/30 00:23

(あとで読む)IO起因による応答速度の低下がなければ賛成ではある理屈

12: hdampty7 2026/05/30 00:26

こいつ馬鹿なのかなと思う。テーブルごとに都度考えればよい話をなんでソフトデリートをやめる設計とか言い出すの?大体、論理削除と状態管理は別の話だろうに。削除はon/offで状態管理というよりフラグだろ。

13: forestk 2026/05/30 01:02

この手の話で毎回思うのだけど「クエリの度に〜を書く必要があり」については「書けば良いのでは」としか思えないのだよなぁ

14: gabill 2026/05/30 01:49

契約状態、休眠状態、解約(未集金無し)、解約(未集金あり)...と状態が増えていったらその都度テーブル増やすのかな