OSSデータベース取り取り時報

第16回 MySQL JSONデータ型のご紹介,PostgreSQL9.6.1リリース,Apache Cassandraリリース予定のバージョン3.10の新機能紹介

この記事を読むのに必要な時間:およそ 4.5 分

MySQLはドキュメントストアのnode.js向けクライアントライブラリConnector/Node.js開発版のマイナーバージョンがありました。今回はドキュメントストアのベースの機能になるJSONデータ型について解説します。PostgreSQLはPostgreSQL9.6.1がリリースされました。PostgreSQL9.1系はEOLのため最後のリリースとなります。Apache Cassandraはバージョン3.10がリリース予定ですが,このバージョンで実装された注目の新機能を紹介します。

[MySQL]2016年11月の主な出来事

製品リリースは,Connector/Node.js開発版のマイナーバージョンアップがあったのみでした。Connector/Node.jsはNode.jsからMySQLサーバに接続するための部品です。このConnector/Node.jsはMySQLサーバをドキュメントデータベースとして活用するための機能群であるMySQLドキュメントストア向けのAPIとなっています。MySQLドキュメントストアではMySQLサーバに格納されたJSONドキュメントに対して,SQLだけではなく新しいMySQL X DevAPIでもアクセスが可能になります。MySQLドキュメントストアの概要は,連載第9回をご覧ください。

MySQLサーバ開発チームのブログでは,Node.jsベースのWebアプリケーションをフロントエンドにExpress.js, バックエンドにAngularJS, そしてConnector/Node.jsを組み合わせたサンプルを公開しています。

MySQLのJSONデータ型のご紹介

MySQLにはMySQL 5.7からJSONデータ型が追加されています。JSONデータ型は格納されるデータ形式が正しいかを自動的にチェックするDocument Validation機能を持ちます。JSONドキュメントの格納時にパースを行い,バイナリ化して格納されています。JSONデータ型内のデータを,文字コードはutf8mb4で照合順序はutf8mb4_binとして扱います。他の文字コードで生成された値をJSONデータ型に格納する場合は自動的にutf8mb4に変換されます。

JSONデータ型の列を持つテーブルの作成とデータの格納

# JSONデータ型の列menuを持つテーブルを作成
mysql> CREATE TABLE pz (menu JSON);

# データを追加
# 複数行にわたるJSONドキュメントの場合,改行を入れても特に問題ない
# JSONドキュメント全体をシングルクォーテーションで囲む
# JSONドキュメント内の文字列はダブルクォーテーションで囲む
mysql> INSERT INTO pz(menu) VALUES ('{
    '> "Name":"Plain Pizza",
    '> "price":300
    '> }');

# 配列を含むJSONドキュメントを追加
mysql> INSERT INTO pz(menu) VALUES ('{
    '> "Name":"Cheesy Pizza",
    '> "price":400,
    '> "toppings":"More Cheese",
    '> "additionals":[{"Name":"B Cheese","price":100}]
    '> }');

# JSONドキュメントではない文字列を追加しようとするとエラーになる
mysql> INSERT INTO pz(menu) VALUES ('some text');
ERROR 3140 (22032): Invalid JSON text: "Invalid value." at position 0 in value for column 'pz.menu'.

MySQL 5.7ではJSON 文字列およびJSONデータ型を処理するための関数や演算子が複数用意されています。またJSONドキュメント内の階層(パス/Path)を表現する方法が用意されています。

JSON関数およびJSON演算子の利用例

# JSONの内容からJSONオブジェクトを取得するJSON_EXTRACT関数の利用例
mysql> SELECT JSON_EXTRACT(menu, "$.Name") FROM pz;
+------------------------------+
| JSON_EXTRACT(menu, "$.Name") |
+------------------------------+
| "Plain Pizza"                |
| "Cheesy Pizza"               |
| "Classic Pizza"              |
+------------------------------+

# JSON_EXTRACT関数と同様の動作をするJSON演算子 -> の利用例
mysql> SELECT menu->"$.Name" FROM pz;
+-----------------+
| menu->"$.Name"  |
+-----------------+
| "Plain Pizza"   |
| "Cheesy Pizza"  |
| "Classic Pizza" |
+-----------------+

JSON関数を使ってJSONドキュメントから抽出した値をMySQL 5.7で実装された生成列(Generated Column)に格納して,その生成列にインデックスを作成することでJSONデータ型へのインデックスを実現できます。

[参考]MySQL 5.7 Reference Manual 14.1.18.8 Secondary Indexes and Generated Columns

MySQL 5.7で実装されたJSONデータ型によって,JSONドキュメント内の値とテーブル内の値をJOINすることや,JSONドキュメントとテーブルを1つのトランザクションで更新することなど,異なるデータストア間では実現しにくい点をMySQL内で処理できることは大きなメリットとなります。

先月のMySQL関連イベントやセミナー,ユーザ会の活動のレポート

第18回 中国地方DB勉強会 in 広島
中国地方の各地でデータベースに関する勉強会を開催している中国地方DB勉強会が「明日から絶対役立つデータベースの話!!」をテーマに勉強会を開催しました。日本PostgreSQLユーザ会の喜田さん,曽根さん,および日本MySQLユーザ会の@yoku0825さんが講演されています。原稿執筆時点では開催前ですので,イベントの様子は次回ご紹介いたします。

著者プロフィール

山本文彦(やまもとふみひこ)

TIS株式会社

アプリ兼インフラエンジニアとしてさまざまなECサイトの開発現場を担当後,現在はOSSサポートサービスにおいて技術コンサルティングや保守サポートに従事。PostgreSQLだけでなく,MySQL, OracleなどのRDB,Amazon DynamoDBといったNoSQLなどさまざまなDB製品の利用経験を活かして,OSS製品の普及活動に力を注いでいる。


木本吉信(きもとよしのぶ)

DataStax Inc.

OSからデータベース,各種アプリケーションの国内導入やローカライズにかかわる仕事を株式会社創夢,イデアコラボレーションズ株式会社,Japan Leadershipで,学生時代から現在に至るまで30年に渡り行う。業務として,また業務の傍ら,マニュアルや書籍,記事の翻訳や監訳・執筆なども行う。


梶山隆輔

MySQL Sales Consulting Senior Manager。

日本オラクル(株)において,MySQLのお客様環境への導入支援や製品の技術解説を担当するセールスコンサルタントチームのアジア太平洋地域リーダー。多国籍なMySQL部門にて,オーストラリア,インド,台湾などに在籍するチームメンバーを束ね,アジア太平洋地域の25以上の国や地域でのMySQL普及やビジネスの拡大をミッションとする。

バックナンバー

OSSデータベース取り取り時報

バックナンバー一覧

コメント

コメントの記入