スキーマレス データベース (特に CouchDB、Couchbase、MongoDB などのドキュメント指向データベース) を使用していて、特定のオブジェクトのデータ表現の形式を変更したい場合は、既存のレコードを古い形式のままにして、新しい形式で新しいレコードを作成することができます。これは、スキーマレス データベースの主な利点の 1 つとして宣言されています (ダウンタイムを回避できるためだと思います)。一方で、同じ種類のデータを多くの形式で処理するのは不便で非効率的です。では、スキーマレス データベースでデータをある形式から別の形式に移行するための適切なアプローチ/戦略は何ですか?
1 に答える
すべてと同様に、これを処理するにはさまざまな方法があります。スキーマレス開発では、通常、保存しているデータを認識しています。スキーマが欠落しているわけではなく、すべてのデータに暗黙的なスキーマがあるため、データベースがスキーマを強制していないということです。json に保存する 10 個のインスタンス変数を持つユーザー オブジェクトがある場合、そこにスキーマがあります。
ケース 1 : 値にはさまざまな可能性、単一の値、配列、またはネストされた構造がある可能性があります
ケース 2 : 値をある形式から別の形式に変更する必要があります。単一の値から値の配列へ
ケース 3 : json キーの存在または非存在。これは非常に簡単です。
ケース 1 の場合: json 値の多様性を期待している場合、特定の値の多様性を App Code ロジックに書き込む必要があります。文字列の場合はこれを行い、配列の場合はそれを行います。
ケース 2 の場合: 1 つの方法として、これを「オン リクエスト」または「オン デマンド」として処理し、変換ロジックをクラス メソッドに組み込み、データがある形式から別の形式に変換されるようにすることができます。これは、データを取得するときに、ある形式から別の形式にデータを変換することを意味します。フラグを立てて、変換したことを示すこともできます。オンデマンドであるため、ドキュメント ストアに "変換" されていないデータがある可能性がありますが、要求された場合は変換されます。
ケース 2 の代替アプローチ: ワーカー プロセスを介してデータを繰り返し処理し、変換します。そのため、リクエストされるのを待つのではなく、実際に変更したいデータを変更するジョブを作成し、変換ロジックをワーカー自体に組み込みます (アプリ コードで同じクラス定義を使用できます)。Couchbase では、View (Secondary Index) を作成したり、Elastic Search を使用して特定のタイプのドキュメントを繰り返し処理したりできます。ワークフロー システムを作成すると、これを多くのワーカーで並行して行うことができます。
>>>> 変換を行うときは、通常、1 つの json k/v を別の json k/v に非破壊的な方法で変換するので、プロセスでエラーが発生した場合でも元のデータは変更されません。その後、古い json k/v を「オンデマンド」で削除する必要があると感じた場合は、後の段階で削除することができます。これは、このタイプの操作に対するより安全なアプローチです。
添付
ケース 1 & 2: データ変換
元の JSON ドキュメント
user::101
{
"uid": 1234,
"type": user,
"my_comment": "the quick brown fox jumped over the lazy dog"
"version": 1.00
}
ここで、非破壊的な方法で変更したいとしましょう。変換されたデータを持つ新しい json キーを簡単に追加できます。
user::101
{
"uid": 1234,
"type": user,
"my_new_comment": ["the quick brown fox jumped over the lazy dog", "comment2"]
"my_comment": "the quick brown fox jumped over the lazy dog",
"version": 1.01
}
非破壊的であることに注意してください。古い json キーはまだそこにあります。代わりに、これを実行して、古いデータを新しいキーとして保存し、予想される json キーを文字列ではなく新しい形式 (配列) に変更することもできます。
user::101
{
"uid": 1234,
"type": user,
"my_comment": ["the quick brown fox jumped over the lazy dog", "comment2"],
"my_comment_v1.00": "the quick brown fox jumped over the lazy dog",
"version": 1.01
}
もちろん、好みに応じて、さまざまなスキームを使用できます。