リレーショナル・データベースによる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ドキュメントを個別の列に格納します。
1つのSQL文でデータを挿入できました。インターフェースと実装が分離されているため、データ型が異なっていても、同じインターフェースであるSQLで処理することができます。
続けて、作成した表store_ordersから、伝票IDを指定して、店舗ID(store_id)と日付、メニューをSQLで検索してみましょう。
JSONドキュメント列(order_detail)とキー名(日付、明細、メニュー)をドットでつないで指定しています。Oracle Databaseでは、このようなドット記法が利用できるため、JSONデータの指定の記述が簡単に行えます。項目メソッドでデータ型を記述することで条件の比較も可能です。
ネストや配列など複雑な構造のJSONを扱いたい場合はどういう記述ができるでしょうか。JSONもリレーショナルも扱えるデータベースでは、両方を使いやすくするための数々のSQL関数が提供されています。関数を利用してネストされた配列のメニューと数量をリレーショナルで表示してみましょう。JSON_TABLE関数を利用すれば、JSONドキュメントをリレーショナルに変換することができます。
複雑な構造のJSONドキュメントでも、このようにリレーショナルに変換しビューとして定義すると、使い慣れたBIツールでの参照も簡単に実装できますね。
JSONをSQLで操作するだけでなく、逆にリレーショナルからJSONを生成する関数もあります。以下のSQLは店舗ID(store_id)、店舗名(store_name)、所在地(loc)で構成される表store_masterのデータをJSONオブジェクトとして返します。
APIやデータ・モデルが実装と別であれば、上記とは逆にドキュメント指向データベースと同様のAPIでリレーショナル・データベース上のデータにアクセスすることもできるはずです。実際、Oracle Databaseの場合は、SQLを使わずに、JSONドキュメントを操作できるSODA API(Simple Oracle Document Access)を提供しています。この場合、作成されたコレクションはJSONドキュメントを格納する列json_documentを持つ表であるため、先に紹介した表のJSONドキュメント列への操作と同じSQLで操作することができます。
以下はSODA APIが利用できるOracle SQLclで行った例です。
さらにクラウドの自律型データベースであるOracle Autonomous Databaseでは、MongoDB APIもサポートされます。こちらを利用すると、先のMongo Shellの例も接続先をAutonomous Databaseに変更するだけでそのまま実行することが可能です。
いくつか操作例を紹介しましたが、JSONとリレーショナルの両方を扱えるデータベースでのJSONの操作イメージが伝わりましたでしょうか。
付け加えますと、データベースに格納したデータには、当然ですが、データベースが持つ機能を有効に利用することができます。Oracle Databaseの場合は、データベース全文検索機能であるOracle Textの技術の応用でJSONドキュメント構造がわからない場合も索引を作成することができたり、PL/SQLでの処理や各種関数(機械学習機能や空間分析機能の関数含む)の利用でJSONデータの使い方を広げたりすることができます。SQLの内容を条件としてアクセス制御をかける仮想プライベート・データベース機能を使えば、ドキュメント・ベースでのセキュリティ・ポリシーを柔軟に実装することも可能です。
もちろん、これまでの回で紹介したパーティショニングや並列実行、インメモリーといった技術も適用できます。これまで自前で検討していたことをデータベース機能に任せるという選択も考えることができます。
まとめ
今回はデータ連携時に利用されるJSONにフォーカスして、ユースケースやRDBMSとの関係性を中心にご紹介しました。
画面開発との親和性の高いJSONとリレーショナルで扱うこととの違い、双方のメリット・デメリットを捉えてデータベースを設計することで、効率の良いシステム開発につながります。さらに近年では、リレーショナルもJSONも同じように扱える、つまりインタフェースや表現が異なるだけで、エンジンは差異なく使えるといったデータベースが提供されています。
これらを活かしながら、ビジネスにおける非常に重要な資産であるデータの利活用をさらに促進していきましょう。