1. ホーム
  2. mongodb

[解決済み】MongoDBでデータのバージョニングを実装する方法

2022-03-27 09:58:26

質問

MongoDBでデータのバージョニングをどのように実装するか、あなたの考えを聞かせてください。(私は Cassandraに関する同様の質問 . もし、どのデータベースが良いという考えがあれば、共有してください)

私は単純なアドレス帳のレコードをバージョンアップする必要があるとします。(アドレスブックのレコードはフラットなjsonオブジェクトとして保存されています)。私は履歴を期待しています。

  • 使用頻度が低い
  • タイムマシン的な演出をするために一度に使う
  • 1つのレコードに数百以上のバージョンが存在することはありません。 履歴が消えることはありません。

以下のようなアプローチを考えています。

  • レコードやレコードの変更の履歴を保存するための新しいオブジェクトコレクションを作成します。これは、アドレス帳のエントリへの参照を持つ、バージョンごとに1つのオブジェクトを格納するものです。そのようなレコードは、次のように見えるでしょう。

    {
     '_id': '新しいID',
     'user': user_id,
     'timestamp': タイムスタンプ。
     'address_book_id': 'アドレス帳のレコードのid'. 
     'old_record': {'first_name': 'Jon', 'last_name': 'Doe' ...}.
    }
    
    

    この方法は、ドキュメントごとにバージョンの配列を保存するように修正することができます。しかし、これは利点がなく、遅いアプローチに思えます。

  • アドレス帳のエントリに添付されたシリアル化(JSON)オブジェクトとしてバージョンを保存する。このようなオブジェクトを MongoDB ドキュメントにアタッチする方法がよくわかりません。おそらく、文字列の配列として格納するのでしょう。 ( CouchDBのシンプルなドキュメントのバージョニングの後にモデル化された )

解決方法は?

このことに飛び込むと、まず大きな疑問が湧いてきます。 チェンジセットをどのように保存しますか? ?

  1. ディフューズ?
  2. レコードの丸ごとコピー?

私個人の考えとしては、差分を保存するのがいいと思います。この差分の表示は本当に特殊な動作なので、差分は別の "history"コレクションに置きます。

別のコレクションを使用するのは、メモリスペースを節約するためです。一般に、単純なクエリでは、完全な履歴は必要ありません。履歴をオブジェクトから除外することで、そのデータがクエリされる際に頻繁にアクセスされるメモリから除外することができるのです。

私の生活を楽にするために、履歴ドキュメントにタイムスタンプ付き差分の辞書を含ませることにします。このようなものです。

{
    _id : "id of address book record",
    changes : { 
                1234567 : { "city" : "Omaha", "state" : "Nebraska" },
                1234568 : { "city" : "Kansas City", "state" : "Missouri" }
               }
}

私の生活を本当に簡単にするために、データにアクセスするために使用するDataObjects (EntityWrapper, 何でも) の一部にします。一般的に、これらのオブジェクトは何らかの形で履歴を持っているので、簡単に save() メソッドでこの変更を同時に行うことができます。

更新日:2015年10月

があるようになったようです。 JSONの差分を処理するための仕様 . これは、差分や変更を保存するための、より堅牢な方法のように思えます。