MongoDBでデータのバージョン管理をどのように実装するかについて、ご意見をお聞かせください。(私はCassandraに関する同様の質問どのDBがより良いかご意見がありましたら、ぜひ共有してください。
単純なアドレス帳のレコードをバージョン管理する必要があるとします。(アドレス帳のレコードはフラットな JSON オブジェクトとして保存されます)。次のような履歴が想定されます。
- あまり使用されない
- すべてを一度に使用して「タイムマシン」のように提示します
- 1 つのレコードに対して数百を超えるバージョンが存在することはありません。履歴は期限切れになりません。
私は以下のアプローチを検討しています:
レコードの履歴またはレコードへの変更を保存するための新しいオブジェクト コレクションを作成します。アドレス帳エントリへの参照を持つバージョンごとに 1 つのオブジェクトを保存します。このようなレコードは次のようになります。
{ '_id': '新しいID', 'ユーザー': ユーザーID、 'タイムスタンプ': タイムスタンプ、 'address_book_id': 'アドレス帳レコードの ID' 'old_record': {'first_name': 'Jon'、'last_name':'Doe' ...} }
このアプローチは、ドキュメントごとにバージョンの配列を保存するように変更できます。ただし、これは利点のない低速なアプローチのようです。
バージョンを、アドレス帳のエントリに添付されたシリアル化された (JSON) オブジェクトとして保存します。このようなオブジェクトを MongoDB ドキュメントに添付する方法はわかりません。おそらく文字列の配列として添付するでしょう。(CouchDB によるシンプルなドキュメント バージョン管理をモデル化)
ベストアンサー1
これを詳しく調べるときの最初の大きな疑問は、「変更セットをどのように保存するか」です。
- 違いは?
- レコード全体のコピーですか?
私の個人的なアプローチは、差分を保存することです。これらの差分の表示は実際には特別なアクションであるため、差分を別の「履歴」コレクションに格納します。
メモリ スペースを節約するために、別のコレクションを使用します。通常、単純なクエリでは完全な履歴は必要ありません。したがって、履歴をオブジェクトから除外することで、そのデータがクエリされるときによくアクセスされるメモリからも除外できます。
作業を楽にするために、タイムスタンプ付きの差分の辞書を含む履歴ドキュメントを作成します。次のようになります。
{
_id : "id of address book record",
changes : {
1234567 : { "city" : "Omaha", "state" : "Nebraska" },
1234568 : { "city" : "Kansas City", "state" : "Missouri" }
}
}
作業を本当に簡単にするために、データにアクセスするために使用する DataObjects (EntityWrapper など) のこの部分を作成します。通常、これらのオブジェクトには何らかの形式の履歴があるため、メソッドを簡単にオーバーライドしてsave()
同時にこの変更を加えることができます。
更新: 2015-10
今はあるようですJSON diffを処理するための仕様これは、差分や変更を保存するためのより堅牢な方法のようです。