SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

オラクル技術エキスパートが紹介する 開発者のためのデータベース完全ガイド

データフォーマット「JSON」とは? リレーショナルとの使い分け、RDBによるJSONのサポートも解説

オラクル技術エキスパートが紹介する 開発者のためのデータベース完全ガイド 第8回

  • X ポスト
  • このエントリーをはてなブックマークに追加

リレーショナル・データベースによるJSONのサポート

 ここで第1回を思い出してみましょう。DBMSの階層構造としてAPI、データモデル、実装は別でした。つまり、DBMSはデータ・モデルやAPIを拡張していくことが可能です。

 Oracle Database、MySQL、PostgreSQLなどのリレーショナルのDBMSもかなり前からJSONを扱えるよう進化しています。2016年にはSQL標準にもJSON関連の仕様が含まれ、各データベースはこれをもとに実装を行っています。

 Oracle Databaseを例にすると、既存のLOBや文字列型でJSONを扱うことからスタートし、Oracle Database 21cからは性能に優れたネイティブなデータ型であるJSON型が利用できます。

 このようなデータベースであれば、JSONの利便性を享受しながら、マスター・データとの結合や集計作業といった操作をSQLで実行、実現することが可能になります。

 以降ではOracle Database 21cを使ったJSONの操作例をご紹介します。

 まず、表の列にJSONドキュメントを格納してみましょう。SQLで表を作成し、店舗IDと中華料理屋さんの伝票のJSONドキュメントを個別の列に格納します。

SQLでの挿入
SQLでの挿入

 1つのSQL文でデータを挿入できました。インターフェースと実装が分離されているため、データ型が異なっていても、同じインターフェースであるSQLで処理することができます。

 続けて、作成した表store_ordersから、伝票IDを指定して、店舗ID(store_id)と日付、メニューをSQLで検索してみましょう。

SQLでの検索
SQLでの検索

 JSONドキュメント列(order_detail)とキー名(日付、明細、メニュー)をドットでつないで指定しています。Oracle Databaseでは、このようなドット記法が利用できるため、JSONデータの指定の記述が簡単に行えます。項目メソッドでデータ型を記述することで条件の比較も可能です。

 ネストや配列など複雑な構造のJSONを扱いたい場合はどういう記述ができるでしょうか。JSONもリレーショナルも扱えるデータベースでは、両方を使いやすくするための数々のSQL関数が提供されています。関数を利用してネストされた配列のメニューと数量をリレーショナルで表示してみましょう。JSON_TABLE関数を利用すれば、JSONドキュメントをリレーショナルに変換することができます。

JSONからリレーショナルへの変換
JSONからリレーショナルへの変換

 複雑な構造のJSONドキュメントでも、このようにリレーショナルに変換しビューとして定義すると、使い慣れたBIツールでの参照も簡単に実装できますね。

 JSONをSQLで操作するだけでなく、逆にリレーショナルからJSONを生成する関数もあります。以下のSQLは店舗ID(store_id)、店舗名(store_name)、所在地(loc)で構成される表store_masterのデータをJSONオブジェクトとして返します。

リレーショナルからJSONへの変換
リレーショナルからJSONへの変換

 APIやデータ・モデルが実装と別であれば、上記とは逆にドキュメント指向データベースと同様のAPIでリレーショナル・データベース上のデータにアクセスすることもできるはずです。実際、Oracle Databaseの場合は、SQLを使わずに、JSONドキュメントを操作できるSODA API(Simple Oracle Document Access)を提供しています。この場合、作成されたコレクションはJSONドキュメントを格納する列json_documentを持つ表であるため、先に紹介した表のJSONドキュメント列への操作と同じSQLで操作することができます。

 以下はSODA APIが利用できるOracle SQLclで行った例です。

SODAの例
SODAの例

 さらにクラウドの自律型データベースであるOracle Autonomous Databaseでは、MongoDB APIもサポートされます。こちらを利用すると、先のMongo Shellの例も接続先をAutonomous Databaseに変更するだけでそのまま実行することが可能です。

 いくつか操作例を紹介しましたが、JSONとリレーショナルの両方を扱えるデータベースでのJSONの操作イメージが伝わりましたでしょうか。

 付け加えますと、データベースに格納したデータには、当然ですが、データベースが持つ機能を有効に利用することができます。Oracle Databaseの場合は、データベース全文検索機能であるOracle Textの技術の応用でJSONドキュメント構造がわからない場合も索引を作成することができたり、PL/SQLでの処理や各種関数(機械学習機能や空間分析機能の関数含む)の利用でJSONデータの使い方を広げたりすることができます。SQLの内容を条件としてアクセス制御をかける仮想プライベート・データベース機能を使えば、ドキュメント・ベースでのセキュリティ・ポリシーを柔軟に実装することも可能です。

 もちろん、これまでの回で紹介したパーティショニングや並列実行、インメモリーといった技術も適用できます。これまで自前で検討していたことをデータベース機能に任せるという選択も考えることができます。

まとめ

 今回はデータ連携時に利用されるJSONにフォーカスして、ユースケースやRDBMSとの関係性を中心にご紹介しました。

 画面開発との親和性の高いJSONとリレーショナルで扱うこととの違い、双方のメリット・デメリットを捉えてデータベースを設計することで、効率の良いシステム開発につながります。さらに近年では、リレーショナルもJSONも同じように扱える、つまりインタフェースや表現が異なるだけで、エンジンは差異なく使えるといったデータベースが提供されています。

 これらを活かしながら、ビジネスにおける非常に重要な資産であるデータの利活用をさらに促進していきましょう。

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
オラクル技術エキスパートが紹介する 開発者のためのデータベース完全ガイド連載記事一覧

もっと読む

この記事の著者

嵐 由香(日本オラクル株式会社)(アラシ ユカ)

 日本オラクル株式会社のエンジニア。最近はAutonomous Database、APEX、OCI Data Integrationを担当。データベース、Webアプリ開発、データ連携の3点セットでお客様のDXをサポートできるよう日々励んでいる。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/15918 2022/05/26 11:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング