JSONデータベースという選択肢 (Couchbase, MongoDB, クラウド等) ① そもそも、なぜJSONなのか？

# はじめに

以前に書いた記事（[JSONデータベースという選択肢 (Couchbase, MongoDB, クラウド等) 序. オープンデータ](https://qiita.com/yoshiyuki_kono/items/c271b1ab6a5e1164ac22)）では、私たちが利用可能なオープンデータのフォーマットとして、広くJSONが用いられていることを、実例をあげて紹介しました。

この記事では、JSON自体について、そして、なぜJSON（データベースが重要）なのか？について、技術的な側面から、整理したいと思います。

# JSON、その歴史と関連技術

## 類似技術との比較
ここでは、先行する技術である、XMLとの比較から、JSONの特徴を解き明かしていきたいと思います。

### XML
ユーザが定義したタグを用いて文章構造を記述するマークアップ言語

### JSON
キーと値(文字列、数値、真偽値、配列)のペアの集まり（オブジェクト）によって、ユーザが定義した構造を持つデータを記述するデータ記述言語。名称と構文はJavaScriptにおけるオブジェクトの表記法に由来。


## XMLとJSONの共通点
- データ記述言語（データ記述言語は、マークアップ言語を包含する概念）として、データと同時に、データの意味と構造を記述することができる
- テキストベースのデータ交換用フォーマット
- データ構造としては、ツリー構造を持つ
  - ツリー構造は、ネットワーク構造以外の、ほとんどのデータ表現のニーズに対応できる(RDBで用いられているテーブル構造や、キーと値のペア等、より単純なデータ構造は、ツリー構造に包含される）。
- プログラミング言語を問わず利用できる
- 仕様が固まってから、十分な歴史・実績を持つ

## JSONのメリット

歴史的に、JSONは、後発ながら、XMLが利用されていたケースを置き換える形で広まってきました。XMLに対するJSONのメリットとしては、以下があります。

- XMLよりも軽量
- JavaScriptに由来するように、プログラミング言語との親和性が高い
  - JSONは、辞書(マップ)や配列・リストのような多くのプログラミング言語がネイティブに持つデータ構造へ直接置換することができる。XMLは、論理的に同じ内容を表現することができるが、JSONのように直接的な対応とは言い難い。


# JSONと、モダンな開発・サービス形態との関係

XMLが、そして後にはJSONが、広く浸透した理由として、その「テキストベースのデータ交換用フォーマット」という特徴が、WEB技術と親和性が高かったことが挙げられます。

[XMLデータベース](https://ja.wikipedia.org/wiki/XML%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9#:~:text=XML%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%81%A8%E3%81%AF%E3%80%81XML,%E3%82%82%E3%81%AE%E3%81%AA%E3%81%A9%E6%A7%98%E3%80%85%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82)という試みもあったとはいえ（「試み」という表現で、歴史の後方に追いやってはいけないかもしれませんが、素直な実感として）、「データ交換」というユースケースが重要だったと考えます（「データ記述」のために用いられた多くのユースケースは無視できませんが、ここでは副次的なものとして扱います。）。

「データ交換」のユースケースの中でも、特に重要だったのが、WEBブラウザー上での扱いだったと考えます。
WEBブラウザ上で実行可能なスクリプト言語の仕様として登場した、非同期更新技術([Ajax](https://ja.wikipedia.org/wiki/Ajax))は、WEBアプリケーションに、ネイティブアプリケーションと遜色のない、ユーザー体験を提供することを実現しました。この非同期更新技術のデータ交換フォーマットとして用いられたのが、当初はXMLであり、後にはJSONが、実質的に標準として取って代わることになります。

その結果が、現在の[SPA(シングルページアプリケーション)](https://ja.wikipedia.org/wiki/%E3%82%B7%E3%83%B3%E3%82%B0%E3%83%AB%E3%83%9A%E3%83%BC%E3%82%B8%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3)、[PWA(Progressive web application)](https://en.wikipedia.org/wiki/Progressive_web_application)の隆盛につながっています。


そして、このような新しいUI技術（SPA, PWA）がなぜ重要かと言えば、ページビューの増加や離脱率の減少に、繋がるからに他なりません（下記の記事では、具体的な数字を交えて紹介されています）。
[PWA（Progressive Web Apps）とは？メリットと実装事例について](https://digital-marketing.jp/seo/what-is-progressive-web-apps/)

さらには、XMLにおいては広く浸透したとは言い難いデータ管理のユースケースにおいても、JSONは、その利点である、XMLに比べた軽量性や、プログラミング言語との親和性に後押しされる形で、XML以来の核心であるデータ記述言語としての（これまでのデータ管理の主流であったRDBに遥かに勝る）柔軟性により、多くのデータベースにおいて、採用されることになりました。

# JSONデータベース

JSONを扱うデータベースとしては、二種類があります。JSONのために設計されたデータベース、そしてJSONのために拡張されたデータベースです。以下、網羅的ではないかもしれませんが、それぞれをリストします。

### JSONのために設計されたデータベース

#### オンプレ/クラウド
- [Couchbase Server](https://www.couchbase.com/products/server)
- [MongoDB](https://www.mongodb.com/)

#### パブリッククラウド提供サービス
- [AWS DynamoDB](https://aws.amazon.com/jp/dynamodb/)
  - [AWS DynamoDB SQL 互換クエリ言語 PartiQL] (https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/ql-reference.html)
- [Azure Cosmos DB](https://azure.microsoft.com/ja-jp/services/cosmos-db/)
  - [Azure Cosmos DB での JSON の使用] (https://docs.microsoft.com/ja-jp/azure/cosmos-db/sql-query-working-with-json)
- [Google Cloud Datastore](https://cloud.google.com/datastore)
- [Oracle Autonomous JSON Database](https://www.oracle.com/jp/autonomous-database/autonomous-json-database/)



### JSONのために拡張されたデータベース

- [Oracle DatabaseのJSON](https://docs.oracle.com/cd/E57425_01/121/ADXDB/json.htm)
- [SQL Server の JSON データ](https://docs.microsoft.com/ja-jp/sql/relational-databases/json/json-data-sql-server?view=sql-server-ver15)
- [MySQL - The JSON Data Type](https://dev.mysql.com/doc/refman/8.0/en/json.html)
- [PostgreSQL - JSONデータ型](https://www.postgresql.jp/document/12/html/datatype-json.html)

# 最後に

今回は、「序」に続く、シリーズの初回として、JSONについて解説し、JSONデータベースについてリストアップしたところで、一旦区切りとしたいと思います。
今後、JSONデータベースについて、別の記事にて、より具体的・実践的な内容を書いていきたいと考えています。

# 参考情報

## JSON仕様について

[事実上最後のJSON仕様「RFC 8259」と「ECMA-404 2nd Editon」公開。UTF-8エンコード必須に](https://www.publickey1.jp/blog/17/jsonrfc_8259ecma-404_2nd_editonutf-8.html)

[ECMA-404 The JSON data interchange syntax 2nd edition, December 2017](https://www.ecma-international.org/publications-and-standards/standards/ecma-404/)

[RFC 8259 「The JavaScript Object Notation (JSON) Data Interchange Format」の和訳](http://www.asahi-net.or.jp/~AX2S-KMTN/internet/rfc8259j.html)

[RFC 8259](https://www.rfc-editor.org/rfc/rfc8259)

## 関連技術

[まだXMLHttpRequestを使ってるの？　fetchのすすめ](https://qiita.com/uhyo/items/91649e260165b35fecd7)

[PWA（Progressive Web Apps）とは？メリットと実装事例について](https://digital-marketing.jp/seo/what-is-progressive-web-apps/)

## JSONデータベース

[Postgres vs. MongoDB for Storing JSON Data — Which Should You Choose?](https://www.sisense.com/ja/blog/postgres-vs-mongodb-for-storing-json-data/)