いたぞ、論理削除だ、コロセ!と正しいデータモデリング

論理削除はコロセ派なので、いいんだけど、ぼんやり思っていることを書く。特に結論はない。

以下の話を自分で思いつくわけはないので、だいたいどこかの本やエントリーからのコピペや切り貼りです。

参照

論理削除が云々について – mike-neckのブログ
Kazuho’s Weblog: 論理削除はなぜ「筋が悪い」か

ただ、immutableなマスタ、更新ログと「現時点のビュー」の3テーブルを準備・運用するというのはそれなりにコストがかかるので、筋が悪い「削除フラグ」(より一般化すれば状態フラグ)を使うかどうかはケースバイケースで判断するのもひとつの見識である。

“CRUDのUとDは要らない”

何周も回ってる話に自転車置き場。

さて。論理削除は正しいデータモデリングすべきだよね。まではわかる。

deleteすべきものは正しくdeleteすべし。必要ならaudit log(監査ログ・操作履歴)を取るという話になるんだけど。
そうすると正しいデータモデリング的にカラムのupdateとかdeleteってあるの?という気になる。
全操作にaudit logがあるべきで、しかもaudit logというか時系列データこそがデータモデルなんじゃないかなあ。

牧歌的なブログのexampleでUsers, Entries があるとして、編集状態のEntryをpublishしたときに、Entryのstateカラムをdraftからpublicにアップデートするんじゃなくて、draftからpublicにするっていうレコードが入るべきで、stateってその結果なんじゃないの。
Userがemailを変更した時に、emailをupdateするけど、updateしていいのか。
変更しますって操作して、ユーザーに確認のメールが飛び、一定時間有効のURLを生成して、メール経由でユーザーにverifyしてもらい、複数あったらどれかをprimaryにしてもらって、えsecondaryとか絶対止めよう、、、。login_emailとの兼ね合いはとかuniqueにしなきゃとかいろいろある。

最適なソリューション

なので、今までテーブルにしていた、UsersやEntries, Commentsってviewなんじゃないかなーとは思う。
と、時系列じゃないデータってほぼない気がして、そう時系列の話ばかりが出てくると、そういうソリューションをはじめから想定しているデータベースを使うほうがいいんじゃないかな、とデータベース選定を始めて夢が広がり、BigTableみたいなやつがピッタリなんじゃないかとCassandra(文章はここで途切れている)

思い出

前職メガネ屋で使ってたspreeはshipments, payments, inventry_units, adjustments, addressesとかそのへん色々考えられてて、理解してる人が作るとそうできるんだけど、理解してない時には複雑なようにしか見えない。
ユーザーが住所変更したら、過去の注文の送付先住所まで変わっちゃったら変だよね、とか。なるほど!そりゃ当たり前だ!、みたいな。

それでも、さらに自分たちで手を加えた部分で、うわーとなったところがあったのを思い出す。お試し五本注文の後、全部返品するか、それとも購入するものがあるか、あとはさらにユーザーが決めた意思と、実際返送されてきた商品があっているか、最後こちらで確認するが、確認するときに誤操作したらどうするか。
(運用チーム)「間違って全返品の操作しちゃいました」(おれ)うわーーほんとに来た 準備はしたしテストもしたけど、キタ みたいな。「現時点のビュー」がレコードになってるから、それを巻き戻すにはレコードあっちこっち書いたり消したりで大変だった。

データモデリングと中のレコードはいいんだけど、その、決済とかがね。

おわり

広告

いたぞ、論理削除だ、コロセ!と正しいデータモデリング」への1件のフィードバック

  1. イベントを追記していく観点ではEvent Sourcingがアプローチとしては現実的なのかなあとちょっとウォッチした時期がありましたが、RDBMSだと効率的に最新の状態をfetchするのがシンドそうで…

    http://blog.arkency.com/2015/05/building-an-event-sourced-application-using-rails-event-store/

    やはりDatomicみたいにデータストアレベルでイベントベースのアプローチを志向してるものじゃないと辛そうだなという認識です。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中