はじめに

こんにちは。Oracle Databaseの検証チームです。
今回はOracle Database26aiで使用できる機能JSONリレーショナル二面性ビューを使ってみましたので、ご紹介したいと思います。

過去のOracle Database 26aiの記事はこちら(名称が一部23aiとなっているものがあります)
今回の執筆者は下記の記事も執筆しています♪是非ご覧ください。
ORACLE MASTER Bronze DBA 2019を取得しました!

JSONリレーショナル二面性ビューについて

JSONリレーショナル二面性ビューとは、同じデータをJSONドキュメント形式、リレーショナル形式の2つの視点で扱い、それぞれの欠点を補うことができる機能です。
データをJSONドキュメント形式で扱うこと、リレーショナル形式で扱うことにはそれぞれ以下の利点・欠点があります。

JSONドキュメント形式

利点:
データがアプリケーションのオブジェクトそのままの形で表現できます。
ドキュメントひとつを見ただけでデータの内容と構造がわかりやすく、多くのプログラミング言語でそのまま読み書きできます、

欠点:
データの共有や重複を防ぐためのプログラムが必要となる場合があります。
複数のドキュメント間の関係を管理するコードを用意しなければなりません。

リレーショナル形式

利点:
効率的にデータを組み合わせられ、データの重複を避けることができます。
データは表ごとに独立しているため、関係が明確に宣言されています。

欠点:
アプリの使うオブジェクトにあわせて表を対応付けする必要があります。
アプリの変更に伴い表の設計を見直すことが多いため、開発を素早く進めにくい場合があります。

JSONリレーショナル二面性ビューを使うことで、リレーショナル表に格納されたデータがJSONドキュメントの集合として提供されます。

 

これによりリレーショナル表の効率性と明確な関係性の利点を活かしつつ、JSONドキュメントの柔軟さと階層構造の表現力を得ることができます。

JSONリレーショナル二面性ビューを使ってみた

ここからは、JSONリレーショナル二面性ビューの使い方を説明します。

1.環境接続

まずはOracle Databaseにsqlplusで接続します。SYSユーザーで操作を行います。

SQL> show user
USER is "SYS"

2.サンプルテーブルの作成および初期データの挿入

次にサンプルテーブルを作成します。
今回は国名と首都をまとめたテーブルを作成します。

SQL> CREATE TABLE cities (
  2      id VARCHAR2(36) DEFAULT SYS_GUID() PRIMARY KEY,
  3      country VARCHAR2(20) NOT NULL,
  4      capital VARCHAR2(20) NOT NULL
  5  );

Table created.

サンプルテーブルが作成されたので、初期データを挿入します。

SQL> INSERT INTO cities
  2      (country, capital)
  3  VALUES
  4      ('Japan', 'Tokyo'),
  5      ('USA', 'Washington D.C.'),
  6      ('China', 'Beijing')
  7  ;

3 rows created.

初期データを挿入したサンプルテーブルをSELECT文で確認してみましょう。

SQL>  SELECT * FROM CITIES;

ID                                   COUNTRY              CAPITAL
------------------------------------ -------------------- --------------------
4028021E605C528DE0636A00000A9154     Japan                Tokyo
4028021E605D528DE0636A00000A9154     USA                  Washington D.C.
4028021E605E528DE0636A00000A9154     China                Beijing

Japan、USA、Chinaの国名及び首都名が記された表が作成されました。

3.JSONリレーショナル二面性ビューの有効化

続いて、JSONリレーショナル二面性ビューを作成します。
注意点として、二面性ビューを作成する際にはドキュメント識別子フィールド「_id」を設定する必要があります。
なお、「_id」の値は自動生成されます。

SQL> CREATE OR REPLACE JSON RELATIONAL VIEW v_cities
  2  AS
  3  SELECT
  4      JSON {
  5          '_id': c.id,
  6          'country': c.country,
  7          'capital': c.capital
  8      }
  9  FROM
 10      cities c
 11  WITH UPDATE INSERT DELETE
 12  ;

View created.

ビューが作成できたので、ビューが作成されているか確認してみましょう。

SQL> SELECT
  2      *
  3  FROM
  4      v_cities
  5  ;

DATA
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
{"_id":"4028021E605C528DE0636A00000A9154","_metadata":{"etag":"43F6B7044AC3D600C0BCE08F230E4636","asof":"0000000002DCCD97"},"country":"Japan","capital":"Tokyo"}
{"_id":"4028021E605D528DE0636A00000A9154","_metadata":{"etag":"DA60F3D4744117737DEE31FFE01911A3","asof":"0000000002DCCD97"},"country":"USA","capital":"Washington D.C."}
{"_id":"4028021E605E528DE0636A00000A9154","_metadata":{"etag":"1AC3BBC3D17AB8557E1BA5A864D5132C","asof":"0000000002DCCD97"},"country":"China","capital":"Beijing"}

JSON形式でビューを確認することができました。

4.二面性ビューへのデータ登録

ここでは、二面性ビューにデータを登録し、
そのデータがビューの元となるリレーショナル形式のデータに反映されているかをチェックしたいと思います。

まず、二面性ビューにKoreaのデータを登録します。

SQL> INSERT INTO v_cities VALUES (
  2      '{
  3          "country": "Korea",
  4          "capital": "Seoul",
  5      }'
  6  );

1 row created.

Koreaのデータがきちんと登録できているか、ビューを確認してみましょう。

SQL> SELECT
  2      *
  3  FROM
  4      v_cities
  5  ;

DATA
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
{"_id":"4028021E605C528DE0636A00000A9154","_metadata":{"etag":"43F6B7044AC3D600C0BCE08F230E4636","asof":"0000000002DCD131"},"country":"Japan","capital":"Tokyo"}
{"_id":"4028021E605D528DE0636A00000A9154","_metadata":{"etag":"DA60F3D4744117737DEE31FFE01911A3","asof":"0000000002DCD131"},"country":"USA","capital":"Washington D.C."}
{"_id":"4028021E605E528DE0636A00000A9154","_metadata":{"etag":"1AC3BBC3D17AB8557E1BA5A864D5132C","asof":"0000000002DCD131"},"country":"China","capital":"Beijing"}
{"_id":"4028021E6060528DE0636A00000A9154","_metadata":{"etag":"6A923214B45F8FBC6152D7CB0FD2BDC4","asof":"0000000002DCD131"},"country":"Korea","capital":"Seoul"}

JSON形式のビューにKoreaのデータが追加されています。

そして、ビューの元になる実表を確認してみましょう。

SQL> SELECT
  2      *
  3  FROM
  4      cities
  5  ;

ID                                   COUNTRY              CAPITAL
------------------------------------ -------------------- --------------------
4028021E605C528DE0636A00000A9154     Japan                Tokyo
4028021E605D528DE0636A00000A9154     USA                  Washington D.C.
4028021E605E528DE0636A00000A9154     China                Beijing
4028021E6060528DE0636A00000A9154     Korea                Seoul

すると、実表にもKoreaのデータが登録されていることが確認できました。

このようにJSONリレーショナル二面性ビューを用いることで、データをリレーショナル形式、JSON形式の2つの形式で同時に扱えることが確認できました!

おわりに

今回の検証はこれで終わりです。
JSONリレーショナル二面性ビューを利用することで、同じデータを「JSONドキュメント」と「リレーショナル表」という2つの異なる形で同時に扱うことができました。

このようにして両者の欠点を補うことで、開発の柔軟性やデータ管理の効率性が向上し、アプリケーション開発や運用の負担を減らすことができますね。

Oracleの課題、専門家が解決します


Oracleの相談を今すぐ依頼する

豊富な実績で最適な解決策をご提供

投稿者プロフィール

技術チーム
技術チーム
DBひとりでできるもんを盛り上げるべく、技術チームが立ち上がり早8年。ひとりでできるもんと言いつつ、技術者が読んでプッとなるような、極めてピンポイントでマニアックな技術ネタを執筆しています!
最新技術情報や資格情報をチェックしたいアナタ!毎日遊びに来てください。きっとお役に立てます。