※ 本記事は、Martin Bachによる”Using Oracle Database 23ai as a Document Store“を翻訳したものです。

2025年6月5日


JSONは最もポピュラーなデータ形式の1つであり、Oracleをはじめとする最新のマルチモデル・データベースはJSONをサポートしています。理想的なのは、データベース・エンジンがNoSQLのようなドキュメントAPIと、柔軟性のあるリレーショナル・モデルの両方がサポートされることです。

SQL標準は、2016年と2023年に強化され、SQL/JSON処理に対応しました。当たり前のことを言うようですが、ドキュメントAPIが初日からドキュメント・データベースをサポートしていることは言うまでもありません。

以前の記事では、Oracle DatabaseでJSONにアクセスする方法が詳しく説明されています。これは、リリース23aiで導入された新しいスキーマ・オブジェクトの一部に関係しています。

JSONスキーマ・オブジェクト

Oracle Database 21cでは、ネイティブJSONデータ型が導入されました(もしさまざまなデータベース・エンジンのJSON実装に関心がおありでしたら、このビデオで詳細を確認できます)。このデータ型を基盤にして、他のスキーマ・オブジェクトを作成できます。そのいくつかと、それらの違い、およびそれらの目的を見てみましょう。

  • 通常の、リレーショナル表とJSON列
  • JSONリレーショナル二面性ビュー
  • JSONコレクション表
  • JSONコレクション・ビュー

このリストの1番目を除き、3つの項目はすべて、Oracle Database 23ai限定の新しいものです。

JSON列を使用した表の作成は簡単です。JSON開発者ガイドの例を次に示します:

create table j_purchaseorder (
   id          varchar2(32) not null constraint pk_purchaseorder primary key,
   date_loaded timestamp(6) with time zone,
   po_document json
);

表は正確には「他の表と同じ」です。何も特別なことはありません。JSONスキーマを使用して内容を検証したり、その他の処理を実行したりすることができます。Multilingual Engine (MLE)が提供するJavaScriptは、JSONを扱うのに最適です。

JSONリレーショナル二面性ビュー

二面性ビューは、前述のリストの中で、Oracle Database 23aiで登場した全く新しいスキーマ・オブジェクトです。これにより、リレーショナル・データ・モデルの効率性とドキュメントAPIの使いやすさを組み合わせることができます。JSONリレーショナル・ケースの使用および二面性ビューの利点の詳細は、『開発者ガイド』を参照してください。

SONリレーショナル二面性ビューを作成するにはDDLコマンド(次を参照)を使用するか、Oracle SQL Developer Extension for VSCodeを使用してグラフィカル・ユーザー・インタフェースでビューを設計します。

HRサンプル・スキーマに基づくJSONリレーショナル二面性ビューの例を次に示します。全ての部門が従業員と共に出力されます。コレクション内のすべてのフィールドを常に公開する一般的なドキュメント・ストアとは異なり、この仮説的な例では関連するものに絞って公開することにしました:

create or replace json relational duality view emp_dept as
hr.departments {
    _id:    department_id
    name:   department_name
    employees: hr.employees @insert @update @delete [
        {
            id:         employee_id
            firstname:  first_name
            lastname:   last_name
            email
        }
    ]
};

JSONリレーショナル二面性ビューは直接更新可能です。つまり、ドキュメントを直接挿入、更新および削除したり、問合せたりできます(前述の例では、書込み可能にするための特定の注釈をつけています)。二面性ビューでサポートされているドキュメントには、常にドキュメント識別子フィールド _id があります。二面性ビューの作成時に指定する必要があります。もちろん、基礎となる表も更新できます。つまり、リレーショナルであれNoSQLであれ、変更はいずれの場合も、すべてのクライアントに即時に反映されます。

二面性ビューの定義を見ると、ビューのDDLが戻されることがわかりますが、データベースの観点からは、JSON型の単一の列DATAが含まれています。

SQL> ddl emp_dept

  CREATE OR REPLACE FORCE EDITIONABLE JSON RELATIONAL DUALITY VIEW "EMILY"."EMP_DEPT"  AS 
  hr.departments {
    _id:    department_id
    name:   department_name
    employees: hr.employees @insert @update @delete [
        {
            id:         employee_id
            firstName:  first_name
            lastName:   last_name
            email
        }
    ]
};
SQL> desc emp_dept

Name    Null?    Type    
_______ ________ _______ 
DATA             JSON   

Oracleの他のJSONと同様に、ビュー内のJSONドキュメントにアクセスします。SQL/JSON関数、単純なドット表記法またはNoSQL APIなど、ニーズに最も適したものを使用してください。SQLを使用した例を次に示します:

select
   -- pretty print the output using json_serialize( ... pretty)
   json_serialize(dv.data pretty) data
from
    emp_dept dv 
where
    dv.data."_id" = 10;

DATA                                                
___________________________________________________ 
{
  "_id" : 10,
  "_metadata" :
  {
    "etag" : "6DF460935D50048D6DE64A71D015EBFD",
    "asof" : "00000000003324C8"
  },
  "name" : "Administration",
  "employees" :
  [
    {
      "id" : 200,
      "firstName" : "Jennifer",
      "lastName" : "Whalen",
      "email" : "JWHALEN"
    }
  ]
}

JSONリレーショナル二面性ビューの詳細は、ディクショナリから確認できます:

select
  collection_name,
  collection_type
from
  user_json_collections;

COLLECTION_NAME    COLLECTION_TYPE    
__________________ __________________   
EMP_DEPT           DUALITY VIEW

関連する追加のディクショナリ・ビューは次のとおりです:

  • USER_JSON_DUALITY_VIEWS
  • USER_JSON_DUALITY_VIEW_LINKS
  • USER_JSON_DUALITY_VIEW_TABS
  • USER_JSON_DUALITY_VIEW_TAB_COLS

ただし、二面性ビューについては、新しいフレックス列機能など、まだまだ語りたいことがたくさんあります。詳細は、JSON開発者ガイドおよびJSONリレーショナル二面性開発者ガイドを参照してください。

JSONコレクション表

JSONコレクション表は、JSON型の単一の列DATAを持つ通常の表です。ほとんどの場合、Simple Oracle Document Access (SODA)Mongo DB APIなどのnoSQL APIにより作成されます。必要であれば、DDLコマンドも使えます。

通常、次のコードによりJSONコレクション表が作成されます:

import { MongoClient } from "mongodb";

/**
 * simple function using the MongoDB API under the covers to create a new
 * collection and insert a document into it.
 */
export async function demo() {

   // use the Mongo DB URI, as per the ADB-S "Tool Configuration",
   // or the output of `ords serve...`. Store the DB_URI in an .env
   // file, and pass this to node using --env-file. Make sure _not_
   // to store the .env file in git!
   const client = new MongoClient(
      process.env.DB_URI, {
         tlsAllowInvalidCertificates: true,
      },
   );
   await client.connect();

   console.log('successfully connected');

   // define which Mongo Database to use
   const db = client.db("EMILY");

   // open/create the (new) collection
   const collection = db.collection("myCollection");

   // this document is based on the Administration department
   // retrieved earlier from the Duality View
   const adminDepartment = {
      name: "Administration",
      employees: [
         {
            id: 200,
            firstName: "Jennifer",
            lastName: "Whalen",
            email: "JWHALEN",
         },
      ],
   };

   // insert the new document
   await collection.insertOne(adminDepartment);

   // close the connection
   await client.close();
}

MongoDB APIが設定されていて、スキーマがORDS (Oracle REST Data Services)が有効になっている場合は、このJavaScriptスニペットをOracleに対してそのまま実行できます(別のドキュメント・ストアを使用した場合のデータベースURIは別です)。

ここでtlsAllowInvalidCertificatesが必要なのは、自己署名証明書(クラウドおよびオンプレミスを含む)を使用して独自のORDSインスタンスをホストする場合のみです。本番設定には適切な証明書チェーンがあります。

ファンクションの実行の最後に、JSONコレクション表が作成されます:

select
  collection_name,
  collection_type
from
  user_json_collections;

COLLECTION_NAME    COLLECTION_TYPE    
__________________ __________________ 
myCollection       TABLE              
EMP_DEPT           DUALITY VIEW

表がmyCollectionを支えるという事実は、Mongo DB APIの観点からは関係ありません。ドキュメントAPIは、表ではなくドキュメントを扱います。JSONコレクション表は単なる手段です。

最終的には「単なる表」なので、通常の表(参照: JSON開発者ガイド)を使用するほとんどの方法でJSONコレクション表を使用できます。列式(表のパーティショニングの場合)や、データに対する制約などを作成できます。表(レプリケーション、バックアップなど)に関するすべての操作は、JSONコレクション表にも適用されます。

非二面性JSONコレクション・ビュー

非二面性コレクション・ビューは、ドキュメントAPIからアクセス可能な通常のビュー、およびドキュメントAPIへのデータの外部化に対する実用的なアプローチと考えてください。単一のJSONオブジェクトを返すかぎり、任意のSQL/JSONファンクションを使って定義できます。非二面性JSONコレクション・ビューは直接更新できません。ドキュメントAPIまたはSQLを使用して、そのドキュメントのみを問合せることができます。必要なデータ変更は、ビューの元となる表をターゲットとして指定する必要があります。

通常、次のビューはマニュアルで定義します。たとえば:

create json collection view empview as
select
   json {
      '_id'         : employee_id,
      last_name,             
      'contactinfo' : {email, phone_number},
      hire_date,
      salary
   }
from
   hr.employees;

現在のスキーマでは、非二面性JSONコレクション・ビューが表示されます:

COLLECTION_NAME    COLLECTION_TYPE    
__________________ __________________ 
myCollection       TABLE              
EMP_DEPT           DUALITY VIEW       
EMPVIEW            VIEW

このようなビューは、スキーマから特定のデータを外部化する場合や、読取り/書込みアクセス権を付与せずにコレクションからフィールドのサブセットを外部化する場合に便利です。

まとめ

Oracle Database 23aiには、JSONリレーショナル二面性ビュー、非二面性JSONコレクション・ビュー、JSONコレクション表など、いくつかの新しいスキーマ・オブジェクトがあります(これらに限定されません)。

は、最初はリレーショナル・データベースの一部でしたが、エンジンは継続的に拡張され、JSONなどの新しいデータ型が継続的に追加されています。

二面性ビューは、フロントエンド/バックエンドの統合を容易にしたり、ドキュメント・ストアからの移行のサポートに加え、リレーショナルの整合性とJSONの柔軟性を同時に満たす強力なモデルを提供します。APIの構築であれ、APEXなどのローコード・プラットフォームの有効活用であれ、二面性ビューは、統合されたトランザクション的で高性能なアプローチを提供します。ドキュメント・ストアという単一目的のデータベースからOracleに移行するユーザーは、移行戦略の一環として二面性ビューを検討するとよいでしょう。『JSONリレーショナル二面性開発者ガイド』には、移行に特化した章があります。

JSONコレクション表は、MongoDB APIなど、Oracleに接続するNoSQLスタイルのAPIで頻繁に作成されます。SODAを使用して開発する場合、そのAPIもJSONコレクション表を作成します。

最後に、非二面性JSONコレクション・ビューを使用して、スキーマのサブセットをドキュメントAPIに実用的に公開できます。

参照

次に示すすべてのドキュメントは、Oracle Database 23aiのドキュメントの一部です。