"CRUD is Dead"なんて言われてる方もいらっしゃるようでCRUDのUとDを禁止する流れが存在するようです。
以下のようなサイトでも言われているように、CRUDのUとDを利用せずデータをログのように扱う方法は関連するデータ(特に履歴)が失われないために好感が持てました。
http://tanakakoichi9230.hatenablog.com/entry/6715376804
http://qiita.com/Jxck_/items/156d0a231c6968f2a474
http://mike-neck.hatenadiary.com/entry/2015/03/24/231422
現在MySQLを利用してウェブサービスを作成しようと考えているのですが、実際にUとDを利用しないDB設計をするにはどうすれば良いのかというところでつまづいてしまいました。
自分で考えたものは5つあります。
①
createdカラムを挿入し、通常Updateしていた部分をInsertで代用する。
この際、更新されないデータも全て最新のデータを複製する。
データ取得時には最新のデータを参照する。
②
createdカラムを挿入し、通常Updateしていた部分をInsertで代用する。
この際、更新されないデータにはNULLを指定する。
データ取得時にはカラム毎のnullではない最新データを参照する。
③
createdカラムを挿入し、通常Updateしていた部分をInsertで代用する。
この際、更新されないデータにはNULLを指定する。
また、最新データ参照用テーブルを作成しトリガーを利用してInsertがあった場合に
自動的に最新データ参照用テーブルの該当するIDのデータをUpdateする。
もちろん、データ取得時には最新データ参照用テーブルを利用する。
④
アクションログ用テーブル(action_id, target_db, target_column, value, created)を作成し全てのデータ操作をログとして残し、ログデータが追加された場合にトリガーを利用して最新データ参照用テーブルをupdateする。(valueの型をどうするべきかは不明。おそらくTEXT型)
⑤
アクションログはRDBではなくログデータとしてディスクに書き込み、RDBは通常通りCRUDする。また、アクションログを書き込むプログラムをモジュール化し、dataModule.set(id, name, value);
などの関数を利用してデータを書き込む際には自動的にログファイルとRDBの両方が書き換えられるようにする。(そのモジュールにログファイルからDBを作成できる機能などあると良いかも)
①は無駄に容量を食うのであまり良くないと思っています。②に関しては「NULLは使うな」と良く言われてるのでそれがひっかかります。あとデータを取得する際に複雑なクエリを発行することになりそうです。③はNULL利用が不安なことは変わりありませんが、データ書き込みと取得で異なるテーブルを使うので複雑クエリ問題は解消しそうです。④この方法が良いんじゃないかと個人的に思っていたのですが、value型をどうするかという問題が残っています。またtext型を利用した場合、大量のログがtext型でinsertされることを考えると少し不安になります(全く問題ないのかもしれませんが)⑤については最終的にこれが一番良いのではないか?と思って現在検討している方法になります。しかしこれだと今までずっと"CRUD is Dead"の考え方できたのに、結局CRUDでDB操作しちゃってますね(汗。しかしログファイルを取ることで、何かあった時にはログファイルからDBを復元したり、調査が必要になった時にログファイルを確認したりできるのでCRUDのUとDは使ってますけどUとDを使わなかった時のメリットは得ることができているといった感じでしょうか。
このように幾つかの方法を考えたのですが、そもそも一般的なベストプラクティスがあるのではないか?と思いましたので是非そういった参考にできるサイトや、俺だったらこうするという意見がございましたら教えていただきたいと思っています。
よろしくお願いいたします。
回答5件
あなたの回答
tips
プレビュー