15
4
3 Answer
14
これは本当に良い質問だと思いますが、答えは、使用しているライブラリと「移行」への期待に基づいて少しばらばらになるでしょう。
いくつかの一般的な移行アクションを見てみましょう。
フィールドを追加します: Mongoはこれを非常に簡単にします。 フィールドを追加するだけで 行った。
*フィールドの削除:*理論的には、実際にはスキーマに縛られていませんが、 したがって、ここでの「削除」は相対的です。 「プロパティ」を削除してフィールドをロードしなくなった場合、そのフィールドがデータ内にあるかどうかは実際には関係ありません。 したがって、データベースを「クリーンアップ」する必要がない場合、フィールドを削除してもデータベースには影響しません。 DBのクリーニングを気にする場合は、基本的にDBに対して巨大なforループを実行する必要があります。
*フィールド名の変更:*これも難しい問題です。 あなたが フィールドの名前を「where」に変更しますか? DBに新しいフィールド名を反映させる場合、基本的にDBで巨大なforループを実行する必要があります。 安全のために、おそらくデータを「追加」してからコードをプッシュし、古いフィールドを「設定解除」する必要があります。
いくつかのしわ
ただし、ActiveRecordオブジェクトと連携したフィールド名の概念は少し偏っています。 ActiveRecordオブジェクトは、実際のデータベースフィールドへのオブジェクトプロパティのマッピングを効果的に提供します。
典型的なRDBMSでは、フィールド名の「サイズ」は実際には関係ありません。 ただし、Mongoでは、フィールド名が実際にデータスペースを占有するため、パフォーマンスの点で大きな違いが生じます。
さて、ActiveRecordのような何らかの「データオブジェクト」を使用している場合、完全なフィールド名をデータに保存しようとするのはなぜですか? DBは、すべてのフィールドをアルファベット順に格納し、オブジェクト側にマップを格納する必要があります。 したがって、ドキュメントには8つのフィールド/プロパティがあり、DB名は "a"、 "b" … "j"になりますが、オブジェクト名は "Name"、 "Price"、 "Quantity"などの読み取り可能なものになります。
これを取り上げる理由は、_フィールド名を変更する_ためにさらに別のしわが追加されるからです。 マッピングを実装している場合、フィールド名を変更しても移行はまったく発生しません。
いくつかのしわ
削除時に移行を_do_実行したい場合は、デプロイ後に_実行_する必要があります。 また、現在のディスク容量を節約しないことを認識する必要があります。
Mongoはスペースを事前に割り当てます。DBの修復を行わない限り、実際に「元に戻す」ことはありません。 そのため、ドキュメントのフィールドを削除しても、それらのドキュメントはディスク上の同じスペースを占有します。 後でドキュメントを移動した場合、スペースを再利用できますが、ドキュメントは大きくなったときにのみ移動します。
多数のドキュメントから大きなフィールドを削除する場合、修復を行うか、新しいインプレースhttp://www.mongodb.org/display/DOCS/compact+Command [compact
]コマンドをチェックアウトします。 。
1
銀の弾丸はありません。 非リレーショナルデータベースではフィールドの追加または削除が簡単です(不要なフィールドを使用したり、新しいフィールドを使用しないでください)スキーマレスdb)では、タスクに応じて、データの移行は同等です。
1
_ 非リレーショナルデータベースでの移行プロセスはどのように見えますか? _
すべての既存データを更新する必要があるかどうかによって異なります。
多くの場合、新しいオプションフィールドを追加するときなど、古いデータに触れる必要はありません。 そのフィールドにもデフォルト値がある場合、アプリケーションが欠落しているフィールドを正しく処理できる場合、古いドキュメントを更新する必要もありません。 ただし、新しいフィールドにインデックスを作成して検索/フィルター/ソートできるようにするには、デフォルト値を古いドキュメントに追加し直す必要があります。
フィールドの名前変更のようなもの(カタログを更新するだけで、データを変更する必要がないため、リレーショナルデータベースでは簡単です)は、MongoDBの主要な仕事です(すべてのドキュメントを書き換える必要があります)。
既存のデータを更新する必要がある場合、通常、すべてのドキュメントを反復処理し、それらを1つずつ更新する移行関数を作成する必要があります(ただし、このプロセスは共有して並行して実行できます)。 大規模なデータセットの場合、これには多くの時間(およびスペース)がかかり、トランザクションが失われる可能性があります(途中で移行がクラッシュした場合)。