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の値により、その二面性ビューの基になるルート表の主キー列が値である、ドキュメント・フィールドを示しています。
-
主キー列が1つのみの場合は、二面性ビューを定義するときに、その列をフィールド
_idの値として使用します。たとえば、例1-1で示されている_id : race_idです。 -
複数の主キー列がある場合は、そのビューを定義するときに、オブジェクトをフィールド
_idの値として使用します。そのオブジェクトのメンバーにより、値が主キー列であるドキュメント・フィールドを指定します。たとえば、カーレースの二面性ビューがあるとします。それには2つの主キー列race_idとrace_yearがあり、それらを一緒に使用することでルート表の行が一意に識別され、どちらか1つでは識別されません。二面性ビュー定義でのこの_idフィールドにより、ドキュメント・フィールドraceIdおよびyearが、それぞれ主キー列race_idおよびrace_yearにマップされます。_id : **{ **raceId** : **race_id**, **year** : **race_year** } **主キー列が1つのみの場合でも、必要に応じて
_idにオブジェクト値を使用できます。これにより、わかりやすいフィールド名を指定できます。たとえば、ここでは、単一の主キー列race_idで、フィールドraceIdの値、およびフィールド_idの値が提供されます:_id : **{**raceId** : **race_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_idに201があるデータ行から生成されます。
このビューでサポートされているドキュメントの生成では、表driver_race_map内の列driver_race_map_id、positionおよびdriver_id、ならびに表driver内の列nameのデータが自動的に結合されます。
注釈(GraphQLディレクティブ) @insert、@updateおよび@deleteはぞれぞれ、そのビューでサポートされているドキュメントをアプリケーションで挿入、更新および削除できることを示すために使用されますが、それらで実行できるのはドキュメントのdriverフィールドに対する更新操作のみであり(レース・ドキュメントの変更時にドライバの挿入や削除はできない)、lapsフィールドの更新はできません(レース・ドキュメントの更新時に周回数を変更することはできない)。
列podiumに適用される@nocheck注釈により、レース・ドキュメント内のフィールドpodiumの更新はそのドキュメントの状態/バージョン(そのETAG値)がチェックされる要因にならないことが指定されています。
関連項目:
-
『Oracle AI Database SQL言語リファレンス』のCREATE JSON RELATIONAL DUALITY VIEW
-
『JSONリレーショナル二面性開発者ガイド』の二面性ビューのドキュメント識別子フィールド
-
『JSONリレーショナル二面性開発者ガイド』の注釈(NO)UPDATE、(NO)INSERT、(NO)DELETEによる更新操作の許可/禁止