0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

抵抗あるだろうなRDB設計シリーズ・論理削除を考える

0
Posted at
Page 1 of 9

過去の関連記事


論理削除とは

  • DBのレコードを物理的に削除せず「削除フラグ」をONにする
  • SELECTするときに削除フラグ=falseのもののみ取得する

SIerの現場では日常的に用いられるアンチパターン


論理削除の問題点

  • 削除フラグをWHERE条件に漏らしたらバグになる
    • JOINが重なると更に深刻
  • ユニーク制約が貼れない
  • レコード数の増大
    • クラウドDBでは費用に直結
    • SELECT時の走査レコード数が費用になるケースもある

総じて、SELECT時に重い負荷となる


なぜ論理削除したいのか

  • 業務要件として
    • 一般ユーザーには見えないように
    • 過去データの参照
    • 誤って削除したときに戻せるように
  • 運用上の要件として
    • 万一必要になった場合に備えて
    • 参照整合性制約違反となるのが辛い

論理削除フラグは最適解か?

  • 一般ユーザーには見えないように
    → 権限によるアクセス管理が適当
  • 過去データの参照
    → 期日によるアクセス管理が適当
    → スナップショットを別テーブルに残す
  • 誤って削除したときに戻せるように
    → UIで抑止:確認ダイアログ/一定時間は戻せるようにする
  • 万一必要になった場合に備えて
    → バックアップから戻す、ログを見るなど代替手段がある
  • 産業整合性制約違反となるのが辛い
    → データ依存を理解し、削除手順を設計する

業務アプリの現実

  • テーブル数が100を超えることも珍しくない
  • このような中、テーブル毎に最適な削除手法を選択するのは大変

しかし・・・削除フラグを導入していい理由にはならない!


代替手段

  • 退避テーブル ←イチオシ
    • Blobコンテナなどへの退避も有り得る
  • バックアップの活用

最後に

  • テーブルを再設計できる機会は少ないと思いますが、問題点を認識しておくのは大事
  • 改善の機会が訪れたときに備えて、良い設計を勉強しておきましょう
  • RDBの設計パターンってほんっと面白いですよ!

来週は楽観ロックの話をします。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?