スキーマのバージョン管理のためのモデルデータ
Overview
データベース スキーマは時々更新する必要があります。たとえば、ユーザーの連絡先情報を保持するように設計されたスキーマは、Twitter や Skype などの新しい通信方法が普及するにつれて、それらの方法を含めるように更新する必要がある場合があります。
同じコレクション内のさまざまな形状のドキュメントをサポートする MongoDB の柔軟なスキーマ モデルを使用して、コレクションのスキーマを徐々に更新できます。スキーマ モデルを更新すると、スキーマ バージョン管理パターンによって、バージョン番号を使用してこれらの更新を追跡できます。アプリケーション コードでは、バージョン番号を使用して、ダウンタイムなしでさまざまな形状のドキュメントを識別し、処理できます。
スキーマ バージョン パターン
スキーマ バージョン管理パターンを実装するには、スキーマを初めて変更するときに、schema_version
(または同様の名前の)フィールドをスキーマに追加します。新しいスキーマを使用するドキュメントでは、スキーマの 2 番目の反復に準拠していることを示すために、schema_version
が 2
である必要があります。スキーマを再度更新する場合は、schema_version
を増分します。
アプリケーション コードでは、ドキュメントの schema_version
またはその欠如を使用して、条件に応じてドキュメントを処理できます。最新のスキーマを使用して、新しい情報をデータベースに保存します。
例
次の例では、users
コレクション内のドキュメントのスキーマを反復処理します。
このスキーマの最初の反復では、レコードには galactic_id
、name
、および phone
フィールドが含まれます。
// users collection { "_id": "<ObjectId>", "galactic_id": 123, "name": "Anakin Skywalker", "phone": "503-555-0000", }
次の反復では、スキーマが更新され、異なる形式でより多くの情報が含まれるようになります。
// users collection { "_id": "<ObjectId>", "galactic_id": 123, "name": "Darth Vader", "contact_method": { "work": "503-555-0210", "home": "503-555-0220", "twitter": "@realdarthvader", "skype": "AlwaysWithYou" }, "schema_version": "2" }
schema_version
を追加すると、アプリケーションは新しいスキーマに合わせて作成されたドキュメントを識別し、それに応じて処理できるようになります。ドキュメントに schema_version
が存在しない場合は、アプリケーションは古いドキュメントを処理できます。
たとえば、galactic_id
でユーザーの電話番号を検索するアプリケーションを考えてみましょう。galactic_id
が与えられたら、アプリケーションはデータベースを照会する必要があります。
db.users.find( { galactic_id: 123 } );
ドキュメントがデータベースから返された後、アプリケーションはドキュメントに schema_version
フィールドがあるかどうかを確認します。
schema_version
フィールドがない場合、アプリケーションは返されたドキュメントを、元のスキーマからphone
フィールドをレンダリングする専用関数に渡します。schema_version
フィールドがある場合、アプリケーションはスキーマ バージョンをチェックします。この例では、schema_version
は2
であり、アプリケーションは返されたドキュメントを、新しいcontact_method.work
フィールドとcontact_method.home
フィールドをレンダリングする専用関数に渡します。
schema_version
フィールドを使用すると、アプリケーション コードは専用のハンドラー関数をコードに追加することで、同じコレクション内で任意の数のスキーマ反復をサポートできます。
ユースケース
スキーマ バージョン管理パターンは、次のいずれかの場合、またはそれらの組み合わせに最適です。
アプリケーションがダウンすることは許されません
ドキュメントの更新には、完了するまでに数時間、数日、または数週間かかる場合があります。
ドキュメントを新しいスキーマバージョンに更新する必要はありません
スキーマ バージョン管理パターンは、従来の表形式データベースと比較して、データ移行をいつどのように行うかをより適切に決定するのに役立ちます。