Documentdb-data-modeling
DocumentDB-データモデリング
DocumentDBのようなスキーマフリーデータベースを使用すると、データモデルへの変更を非常に簡単に取り入れることができますが、データについて考えるのにしばらく時間をかける必要があります。
- あなたにはたくさんの選択肢があります。 当然、JSONオブジェクトグラフまたはJSONテキストの生の文字列だけで作業できますが、コンパイル時にクラスを定義せずに実行時にプロパティにバインドできる動的オブジェクトを使用することもできます。
- また、実際のC#オブジェクト、またはそれらが呼び出されたエンティティ(ビジネスドメインクラス)を操作することもできます。
関係
ドキュメントの階層構造を見てみましょう。 必要なid、lastName、isRegisteredなどのトップレベルプロパティがいくつかありますが、ネストされたプロパティもあります。
- たとえば、parentsプロパティは、角括弧で示されるJSON配列として提供されます。
- この例では、配列に子が1つしかない場合でも、子用の別の配列もあります。 これが、ドキュメント内の1対多の関係に相当するものをモデル化する方法です。
- 単純に配列を使用します。配列内の各要素は、単純な値または別の複雑なオブジェクト、さらに別の配列になります。
- したがって、1つの家族は複数の親と複数の子を持つことができ、子オブジェクトを見ると、それ自体が子とペットの1対多の関係のネストされた配列であるペットのプロパティを持っています。
- locationプロパティについては、3つの関連するプロパティ、州、郡、市をオブジェクトに結合しています。
- オブジェクトの配列を埋め込むのではなく、この方法でオブジェクトを埋め込むことは、リレーショナルデータベースの別々のテーブルにある2つの行の間に1対1の関係を持たせることに似ています。
データを埋め込む
DocumentDBなどのドキュメントストアでデータのモデリングを開始するときは、エンティティをJSONで表される自己完結型ドキュメントとして扱うようにしてください。 リレーショナルデータベースを使用する場合、常にデータを正規化します。
- データを正規化するには、通常、顧客などのエンティティを取得し、連絡先の詳細や住所などの個別のデータに分割します。
- 連絡先の詳細と住所をすべて記載した顧客を読むには、JOINSを使用して実行時にデータを効果的に集約する必要があります。
ここで、ドキュメントデータベースの自己完結型エンティティと同じデータをモデル化する方法を見てみましょう。
ご覧のとおり、顧客のすべての情報が単一のJSONドキュメントに埋め込まれている顧客レコードを非正規化しています。
NoSQLには無料のスキーマがあるため、連絡先の詳細と住所を異なる形式で追加することもできます。 NoSQLでは、1回の読み取り操作でデータベースから顧客レコードを取得できます。 同様に、レコードの更新も単一の書き込み操作です。
以下は、.Net SDKを使用してドキュメントを作成する手順です。
- ステップ1 *-DocumentClientをインスタンス化します。 次に、myfirstdbデータベースを照会し、MyCollectionコレクションを照会します。MyCollectionコレクションは、このプライベート変数コレクションに格納し、クラス全体でアクセスできるようにします。
- ステップ2 *-CreateDocumentsタスクでいくつかのドキュメントを作成します。
最初のドキュメントは、この動的オブジェクトから生成されます。 これはJSONのように見えるかもしれませんが、もちろんそうではありません。 これはC#コードであり、実際の.NETオブジェクトを作成していますが、クラス定義はありません。 代わりに、プロパティはオブジェクトの初期化方法から推測されます。 また、このドキュメントのIdプロパティが提供されていないことにも気づくでしょう。
- ステップ3 *-次に、CreateDocumentを見てみましょう。データベースとコレクションの作成で見たのと同じパターンのように見えます。
- ステップ4 *-今回は、ドキュメントを追加するコレクションのSelfLinkを指定してCreateDocumentAsyncを呼び出します。 この場合、システムによって生成されたプロパティを持つ新しいドキュメントを表すリソースプロパティを持つ応答が返されます。
次のCreateDocumentsタスクでは、3つのドキュメントを作成しました。
- 最初のドキュメントでは、Documentオブジェクトはリソースから継承するSDKで定義されたクラスであるため、すべての共通リソースプロパティがありますが、スキーマフリードキュメント自体を定義する動的プロパティも含まれています。
- この2番目のドキュメントは、生のJSON文字列でのみ機能します。 ここで、JavaScriptSerializerを使用して文字列をオブジェクトに逆シリアル化するCreateDocumentのオーバーロードにステップインし、最初のドキュメントの作成に使用したのと同じCreateDocumentメソッドに渡します。
- 3番目のドキュメントでは、アプリケーションで定義されているC#オブジェクトCustomerを使用しました。
この顧客を見てみましょう。IDとアドレスのプロパティがあります。アドレスは、さらに別のネストされたオブジェクトである場所を含む独自のプロパティを持つネストされたオブジェクトです。
また、フェンスの両側で適切な規則を維持したいため、JSONプロパティ属性も用意されています。
したがって、ネストされた子オブジェクトと共にNew Customerオブジェクトを作成し、CreateDocumentをもう一度呼び出します。 顧客オブジェクトにはIdプロパティがありますが、値を提供しなかったため、DocumentDBは前の2つのドキュメントの場合と同様に、GUIDに基づいて値を生成しました。
上記のコードをコンパイルして実行すると、次の出力が表示されます。