1.1 JSONリレーショナル二面性の表中心ユースケース

表中心のデータベース・アプリケーションの開発者は、二面性ビューを使用して、JSONドキュメントを使用するアプリケーションとインタフェースで接続しそれらを活用できます。二面性ビューにより、リレーショナル表データがドキュメントにマップされます。

表中心のユースケース: 表中心である1つ以上のアプリケーション(つまり、それらでは正規化されたリレーショナル・データが主に使用される)を開発しているか、これから開発するとします。同時に、一部の表データのJSONドキュメント・ビューをアプリケーション(多くの場合、クライアント・アプリケーション)に提示する必要があるとします。ビューおよびそれらのドキュメントは、部分的または全体的に、更新可能である必要があることがあります。

二面性ビューのその他の主要ユースケースについては、「JSONリレーショナル二面性のドキュメント中心ユースケース」(ドキュメント中心のアプリケーションの開発)で説明しています。この場合は、開発者は、使用する必要があるJSONドキュメント(通常はアプリケーション・オブジェクトに基づく)から始めるか、少なくともそれらのドキュメントのモデルから始めます。そのコンテキストでは、二面性ビューの作成には次のステップが含まれます:

  1. 既存の(または想定される)ドキュメント・セットを分析して、様々な種類のドキュメントの基本的なロジックを表す正規化されたエンティティおよびリレーションを定義します。(「カーレースの例、エンティティ関係」を参照してください。)

  2. これらのエンティティを実装可能なリレーショナル表を定義します。(「カーレースの例、表」を参照してください。)

  3. 様々な種類のドキュメントをサポート/生成するように、これらの表に対して様々な二面性ビューを定義します。(「二面性ビューの作成」を参照してください。)

ノート:

既存のドキュメント中心アプリケーションを移行する場合は、多くの場合、JSON-to-Dualityマイグレータを利用して、このプロセス(ステップ1から3)の大部分を自動化できます。『Oracle Databaseユーティリティ』JSONから二面性への移行を参照してください。

ステップ3は、それ単独で、JSONリレーショナル二面性の表中心ユースケース(既存のリレーショナル・データに対する二面性ビューの作成)を表しています。1つ以上のドキュメント・セットから開始しそれらを分析してそれらの基になるリレーショナル表を作成する(ステップ1と2)のではなく、すでに存在する表に基づいて、二面性ビュー、およびそれらでサポートするドキュメント・コレクションを直接定義します。

既存のリレーショナル・データに基づいて二面性ビューを定義することは簡単です。これは、データがすでにデータ分析とファクタリング(正規化)を実行されているためです。そのため、既存のリレーショナル・データをJSONドキュメントのセットとして再使用するようにドキュメント中心のアプリケーションを改良することや定義することは簡単です。これには、リレーショナル・データとJSONデータの二面性という非常に優れた点があります。既存の広範囲のリレーショナル・データを簡単にJSONドキュメントのセットとして使用可能にできます。

すぐに単純なSQLの例を確認して、関連するすべてについての説明はなしで、二面性ビューの作成と使用がいかに簡単かを知ることができます。

departmentがあり、その主キー列としてdeptnoがあるとします。

CREATE TABLE department
  (deptno     NUMBER(2,0),   
   dname      VARCHAR2(14),   
   loc        VARCHAR2(13),   
   CONSTRAINT pk_dept PRIMARY KEY (deptno));

1つの表に対して二面性ビュー(department_dv)を作成するために実行する必要があることをすべて次に示します。このビューでは、表データが、フィールド_iddepartmentNameおよびlocationを含むJSONドキュメントのコレクションとして公開されます。

CREATE JSON RELATIONAL DUALITY VIEW department_dv AS
  SELECT JSON {'_id'            : d.deptno,
               'departmentName' : d.dname,
               'location'       : d.loc}
    FROM department d WITH UPDATE INSERT DELETE;

「二面性ビューの作成」では、SQL文CREATE JSON RELATIONAL DUALITY VIEWについて詳しく説明しています。ここでは、二面性ビューを作成するためのこの構文により表departmentの列が選択されてそのビューのサポート対象ドキュメントとしてJSONオブジェクトが生成されると述べれば十分でしょう。

deptnodnameおよびlocは、ドキュメント生成のために、それぞれドキュメント・フィールド_iddepartmentNameおよびlocationにマップされます。脚注1この二面性ビューによってサポーされるドキュメントには、それら3つのフィールドのみを含む単一のJSONオブジェクトがあります。(このJSON {...}という構文は、それらのフィールドを含むオブジェクトを示しています。)

注釈WITH UPDATE INSERT DELETEにより、二面性ビューが完全に更新可能として定義されます: アプリケーションでドキュメントを更新、挿入および削除でき、これにより、基になる表が更新されます。

すぐにこの二面性ビューからドキュメントを問い合せる(選択する)ことができます。各ドキュメントは次のようになります:

{_id            : <department number>,
 departmentName : <department-name string>,
 location       : <location string>}

ここでは、次のように定義されている表employeesもあるとします。それには主キー列empnoがあり、表deptの列deptnoを参照する外部キー列deptnoがあります。

CREATE TABLE employee
  (empno    NUMBER(4,0),   
   ename    VARCHAR2(10),   
   job      VARCHAR2(9),   
   mgr      NUMBER(4,0),   
   hiredate DATE,   
   sal      NUMBER(7,2),   
   deptno   NUMBER(2,0),   
   CONSTRAINT pk_emp PRIMARY KEY (empno),   
   CONSTRAINT fk_deptno FOREIGN KEY (deptno) REFERENCES department (deptno));

この場合は、少し複雑な、部門の二面性ビューdept_w_employees_dvを定義できます。これには、部門の従業員についてのデータが含まれています:

CREATE JSON RELATIONAL DUALITY VIEW dept_w_employees_dv AS
  SELECT JSON {'_id'            : d.deptno,
               'departmentName' : d.dname,
               'location'       : d.loc,
               'employees'      :
                 [ SELECT JSON {'employeeNumber' :e.empno,
                                'name' : e.ename}
                     FROM employee e
                     WHERE e.deptno = d.deptno ]}
    FROM department d WITH UPDATE INSERT DELETE;

ここでは、各部門オブジェクトにもemployeesフィールドがあり、その値は従業員オブジェクト配列です(JSON [...]構文に注目してください) (内側のJSON {...}構文)。従業員オブジェクト・フィールドの値は、employee表の列employeeNumbernameから取得されます。

ドキュメント内の従業員情報を生成するために、それらの表はWHERE句で結合されています: リストされる各従業員の部門は、ドキュメントで表されている部門と同じ番号である必要があります。

このビューの単純な問合せでは、次のようなドキュメントが返されます:

{_id            : <department number>,
 departmentName : <department-name string>,
 location       : <location string>
 employees      :
   [ {employeeNumber : <employee number>,
      name           : <employee name>} ]}


脚注一覧

脚注1: 二面性ビューでサポートされるドキュメントには、最上位レベルのドキュメント識別子フィールド_id (これはビューの基になるルート表の識別列に対応付けられいる)を含める必要があります。この場合、それは主キー列deptnoです。