2015
10
21
10
21
MySQLのデータ型にJSON型が加わっていた
RSSに入ってくるソフトウェアの更新情報を追っていたらMySQLがデータ型にいつの間にやらJSON型を追加していた。SQLもNoSQLの特徴を取り入れて双方は近づいていくという話どおりのことであるが、ちと試しておく。
JSON型とはいわゆるJSONドキュメントのことだが、つまりはスキーマレスなデータ型を保存できるというのが大きな特徴。従来のリレーショナルデータベースではサイズが不定になるようなデータは型として基本的になかった、MySQLにはENUMやSETがあったがまあ例外。 JSON型ということは配列だけでなく辞書型のようなものまでデータとして使えるということになる。
Ubuntu14.04を動かして試してみた。まだデフォルトのリポジトリには最新版が来てなかったので、下記を参考にインストールした。
http://www.devopsservice.com/installation-of-mysql-server-5-7-on-ubuntu-14-04/
基本的なことはドキュメント参照。
http://dev.mysql.com/doc/refman/5.7/en/json.html
とりあえず適当なテーブルを作ってみる。テーブルにはフルーツや野菜などの作物を登録することにする。カラムとしてnameに作物の名前を、tagというカラムにJSON型で適当に特徴を記録する。
フルーツを選ぶ。
SELECT * FROM foo WHERE JSON_CONTAINS(tag, '"fruit"');

赤いものを選ぶ。
SELECT * FROM foo WHERE JSON_CONTAINS(tag, '"red"');

複数条件にしたければ下記のようなクエリも。
SELECT * FROM foo WHERE JSON_CONTAINS(tag, '["red", "small"]');
赤くない作物とかも。
SELECT * FROM foo WHERE NOT JSON_CONTAINS(tag, '"red"');
JSON型を導入することで一対多、多対多の導入が中間テーブルなしでできるようになったりする。便利で有効な使い方を考えていきたい。
JSON型とはいわゆるJSONドキュメントのことだが、つまりはスキーマレスなデータ型を保存できるというのが大きな特徴。従来のリレーショナルデータベースではサイズが不定になるようなデータは型として基本的になかった、MySQLにはENUMやSETがあったがまあ例外。 JSON型ということは配列だけでなく辞書型のようなものまでデータとして使えるということになる。
Ubuntu14.04を動かして試してみた。まだデフォルトのリポジトリには最新版が来てなかったので、下記を参考にインストールした。
http://www.devopsservice.com/installation-of-mysql-server-5-7-on-ubuntu-14-04/
基本的なことはドキュメント参照。
http://dev.mysql.com/doc/refman/5.7/en/json.html
とりあえず適当なテーブルを作ってみる。テーブルにはフルーツや野菜などの作物を登録することにする。カラムとしてnameに作物の名前を、tagというカラムにJSON型で適当に特徴を記録する。
CREATE TABLE foo (
tag JSON,
name nchar(30)
);
INSERT INTO foo VALUES('["red", "vegetable"]', 'tomato');
INSERT INTO foo VALUES('["green", "vegetable", "long"]', 'cucumber');
INSERT INTO foo VALUES('["yellow", "fruit", "long"]', 'banana');
INSERT INTO foo VALUES('["red", "fruit", "small"]', 'strawberry');
INSERT INTO foo VALUES('["orange", "fruit"]', 'orange');
INSERT INTO foo VALUES('["omg"]', 'durian');
フルーツを選ぶ。
SELECT * FROM foo WHERE JSON_CONTAINS(tag, '"fruit"');

赤いものを選ぶ。
SELECT * FROM foo WHERE JSON_CONTAINS(tag, '"red"');

複数条件にしたければ下記のようなクエリも。
SELECT * FROM foo WHERE JSON_CONTAINS(tag, '["red", "small"]');
赤くない作物とかも。
SELECT * FROM foo WHERE NOT JSON_CONTAINS(tag, '"red"');
JSON型を導入することで一対多、多対多の導入が中間テーブルなしでできるようになったりする。便利で有効な使い方を考えていきたい。
スポンサーサイト