論理削除、サロゲートキー(代理キー)

論理削除とは

バックエンドを使っていてDBに触れる機会があると、データの検索で条件分岐させなければいけないときがある。そんなときに、論理削除と物理削除というものを聞いた。なんてことはないのだが、論理削除というのは、実際にはデータは削除しておらず、フラグを用いて削除されたものとみなすこと。物理削除は論理削除よりも当然という感じで、DBから正真正銘消してしまうこと。コードで良く用いるのが論理削除だと思う。SQLだとwhere条件にFALSEや0などを取る。または、delete_flgかな。cancel_flgとかも良く見る気がする。

WHERE is_deleted = FALSE(あるいは0など)

しかし、delete_flg、論理削除なんかは使わない方が良いというような話もあるようだ。UNIQUE制約が使えなくなるし、複雑になりがちっていうような理由らしい。

cf、削除フラグっているの?いらないの?(最終閲覧2020/06/16)

サロゲートキー(代理キー)

サロゲートキー(代理キー)で外部キー制約した場合には、関連したデータは別扱いになり、ナチュラルキー(自然キー)の場合には死ぬと。
結局、ケースバイケースってことかな。代理キーはDBのストレージ領域を無駄に圧迫するらしい。そんなことないだろっても思うけど、膨大なデータになればそれだけ処理量も増えるわけで、その少しの隙が結構大問題(致命的なバグ)につながりかねない。まあ、データの中身にも寄ると思う。被っててもデータの日時が違えば別データとして扱いたい場合もあるだろうし、それは臨機応変にってことかもしれない。
まだ、エンジニアとして浅いからかサロゲートキーも結構見る気がするんだけど、そんなものなのだろうか。

参照

cf、論理削除と物理削除とは(最終閲覧2020/06/16)

basic, php, SQL

Posted by himajinn