JSONの二面性ビュー

Oracle Database API for MongoDBは、JSONリレーショナル二面性ビューでサポートされているドキュメントで使用できます。このようなドキュメントは、基礎となる表データに基づいて自動的に生成されます

JSONリレーショナル二面性ビューは、Oracle AI Databaseリリース26ai以降でのみサポートされています。

JSONリレーショナル二面性ビューでは、リレーショナル・データベース表に格納されているデータがJSONドキュメントとして公開されます。そのドキュメントは、要求に応じてマテリアライズされるため、格納されません。二面性ビューでは、データに概念的二面性と運用的二面性が両方与えられます: それは、リレーショナル形式と階層形式の両方で編成されます。複数の異なる二面性ビューを、同じ表1つ以上に格納されたデータに基づくようにし、共有されている同じデータに複数の異なるJSON階層を提供できます。

これはつまり、アプリケーションで、JSONドキュメントのコレクションとして、または関連する一連のデータベース表および列として、同じデータにアクセス(作成、問合せ、変更)できるということであり、両方の手法を同時に採用できます。

二面性ビューによって実現されるドキュメントは、通常のドライバ、フレームワーク、ツールおよび開発方法を使用して、これまでと同じ方法で操作できます。具体的に述べると、アプリケーションで任意のプログラミング言語を使用できるということです。

アプリケーションでは、二面性ビューでサポートされているドキュメント・コレクションが、ドキュメントがJSONデータ型の表列に格納されているかのように使用されます。MongoDB APIコールでは、二面性ビュー名をcollection-name引数として使用します。

ノート: ビューの作成時に二面性ビュー名が引用符で囲まれていない場合は、必ず、MongoDB APIコールでその名前を大文字として渡してください。たとえば、ビューの作成時にmy_dvが使用されていた場合は、コレクション名として"MY_DV"を渡します。ビューの作成時に"my_dv"が使用されていた場合は、"my_dv"を渡します。

重要なユース・ケースの1つである、MongoDB APIアプリケーションでは、既存のデータベース・データを簡単に利用できます。そのデータを基に1つ以上の二面性ビューを作成するだけで、JSONコレクションがサポートされます。

JSONリレーショナル二面性の重要な側面は、様々な種類のJSONドキュメントで同じデータを共有できることです(また、リレーショナル表で同じデータを共有できます)。二面性ビューをどのように定義したかで、どのデータが共有されるかとその方法(誰がどのドキュメント部分に対してどの種類の更新操作を実行できるか)が決まります。

MongoDB APIで使用するJSON二面性ビューの作成

MongoDB APIを使用してJSONリレーショナル・ビューを作成することはできません。これを行うには、SQL文CREATE JSON RELATIONAL DUALITY VIEWを使用します。

すべての二面性ビューは、MongoDB APIと互換性があります。それらには必ず、そのドキュメント識別子としてフィールド_idがあります。フィールド_idの値により、その二面性ビューの基になるルート表の主キー列が値である、ドキュメント・フィールドを示しています。

フィールド_idによってそのマップ先の主キー列に提供される値が、これらの列に挿入可能である必要があります。つまり、それらのデータ型に、列の型との互換性が必要です。たとえば、フィールド_idが、SQL型がNUMBERの単一の主キー列にマップされている場合は、挿入するドキュメントの_id値が数値である必要があります。そうでない場合は、挿入しようとするとエラーが発生します。

挿入するドキュメントに_idフィールドを明示的に含めなかった場合は、ObjectId値で、それが自動的に追加されます。(_idフィールドでObjectId値を明示的に使用することもできます。) ObjectId値は、二面性ビューでSQL型RAWの列にマップされているフィールドにのみ使用できます。

例1-1 GraphQLの使用によるJSON二面性ビューRACE_DVの作成

この例では、カーレースのレース・ドキュメントをサポートする、二面性ビューrace_dvを作成します。

CREATE JSON RELATIONAL DUALITY VIEW **race_dv** AS
  **race** **@insert** **@update** **@delete**
    {**_id** : **race_id**
     name   : name
     laps   : laps **@noupdate**
     date   : race_date
     podium : podium **@nocheck**
     result : **driver_race_map** **@insert** **@update** **@delete**
       **[** {driverRaceMapId : driver_race_map_id
          position        : position
          driver **@noinsert** **@update** **@nodelete**
                 **@unnest** {driverId : driver_id,
                          name     : name}} **]**};

この定義は、『JSONリレーショナル二面性開発者ガイド』のGraphQLの使用による二面性ビューRACE_DVの作成での定義と同じです。類似する、ドライバおよびレースのドキュメントの二面性ビュー作成については、そのドキュメントを参照してください。この例のSQLコードでは、Oracle GraphQLコードを埋め込みます。または、SQLの使用によるネストされていないドライバ情報を含む二面性ビューRACE_DVの作成で示すように、定義にSQLコードのみを使用することもできます。

この二面性ビューでは、次のようなレース・オブジェクトを含むJSONドキュメントがサポートされています。それらにはresultフィールドが含まれており、その値は、指定したレースにおけるドライバとその結果の順位を示すオブジェクトの配列です:

{"**_id**" : 201,
"name" : "Bahrain Grand Prix",
"laps" : 57,
"date" : "2022-03-20T00:00:00",
"podium" : {...},
"**result**" : **[** {"driverRaceMapId" : 3,
              "position" : 1,
              "driverId" : 103,
              "name" : "Charles Leclerc"},... **]**}

ドキュメント識別子フィールド_idの値は、ルート表raceの単一の主キー列race_idから取得されます。たとえば、値が201である_idフィールドで識別されたドキュメントは、二面性ビューの基になるルート表(race)の主キー列race_id201があるデータ行から生成されます。

このビューでサポートされているドキュメントの生成では、表driver_race_map内の列driver_race_map_idpositionおよびdriver_id、ならびに表driver内の列nameのデータが自動的に結合されます。

注釈(GraphQLディレクティブ) @insert@updateおよび@deleteはぞれぞれ、そのビューでサポートされているドキュメントをアプリケーションで挿入、更新および削除できることを示すために使用されますが、それらで実行できるのはドキュメントのdriverフィールドに対する更新操作のみであり(レース・ドキュメントの変更時にドライバの挿入や削除はできない)、lapsフィールドの更新はできません(レース・ドキュメントの更新時に周回数を変更することはできない)。

podiumに適用される@nocheck注釈により、レース・ドキュメント内のフィールドpodiumの更新はそのドキュメントの状態/バージョン(そのETAG値)がチェックされる要因にならないことが指定されています。

関連項目: