web-dev-qa-db-ja.com

MongoDB / NoSQLでの変更履歴データの構造化

変更を追跡する必要があるチャートがあります。 Chartにはいくつかのプロパティがあります。チャートには、アイテムの長いリストもあります。

したがって、C#では、Chartオブジェクトは次のようになります。

public class Chart {
    public int Id { get; set; }
    public string Title { get; set; }
    ...
    public List<ChartItem> Items { get; set; }
}

またはJSONで、私のチャートは次のようになります(このJSONを手動で作成したため、間違っている可能性があります)。

{
    "Id": 1,
    "Title": "Test Chart",
    "Items": [
        {
            "Id": 222,
            "Title": "Test Item",
            "Price": 112.34
        }
    ]
}

だから私の質問は次のとおりです:

変更があるたびに、すべてのアイテムを含むチャート全体を単一のドキュメントとして記録する必要がありますか? (私が読んだのは、ドキュメントのサイズに制限があるかもしれないので、これは問題になるかもしれません。)

OR

グラフの変更を1つのタイプのドキュメントとして記録し、グラフアイテムの変更を別のタイプのドキュメントとして記録する必要がありますか?これにより、単一のグラフアイテムに変更があるたびにグラフ全体を保存する必要なく、グラフアイテムへの変更を単一の「ラインアイテム」ドキュメントとして保存できます。

OR

もっと良い方法はありますか?

1
Targaryen

@DANIEL WATROUSブログ ここ 文書のサイズとそれらが変更される頻度は、履歴データの保持を考慮する必要があります。

変更があるたびに、すべてのアイテムを含むチャート全体を単一のドキュメントとして記録する必要がありますか? (私が読んだのは、ドキュメントのサイズに制限があるかもしれないので、これは問題になるかもしれません。)

あなたのJSONコードに従って

{
    {"Id": 1},
    {"Title": "Test Chart"},
    {"Items": [
        {
            "Id": 222,
            "Title": "Test Item",
            "Price": 112.34
        }
    ]
}}

MongoDB BOLとして-- ここ BSONドキュメントの最大サイズは16メガバイト。

MongoDBの各ドキュメントには、作成時に特定のサイズが割り当てられます。ドキュメントのサイズを大きくする更新では、更新されたドキュメントをディスクに格納してドキュメントを移動するのに十分な大きさの新しいドキュメントを割り当てる必要があります。これは、特に大量の場合、実行するのにコストのかかる操作になることがあります。

グラフの変更を1つのタイプのドキュメントとして記録し、グラフアイテムの変更を別のタイプのドキュメントとして記録する必要がありますか?これにより、単一のグラフアイテムに変更が加えられるたびにグラフ全体を保存する必要なく、グラフアイテムへの変更を単一の「ラインアイテム」ドキュメントとして保存できます。

一意に識別するアイテムデータを処理する場合、いくつかのオプションがあります。 1つは、オブジェクトが履歴に置かれたときに一意の値を計算することです。これは、最上位のオブジェクトIDと連続するバージョン番号の組み合わせになります。もう1つは、オブジェクトが読み込まれたときにハッシュを生成することです。 2番目のアプローチの問題は、特定の日付オブジェクトのクエリがより複雑になることです。

あなたのさらなる参考のために ここ

1