SQLとJSON JSONデータをRDBに格納する

みなさんご存知のようにJavaScriptが大流行である。
サーバー側でもnodejsでJavaScriptだし。ブラウザでもなんかしようと思ったらJavaScriptだし。jQueryは便利だし。

JavaScriptといえば、データの受け渡しはJSONだよね。

key&valueのnoSQLならそのまま格納OKだし。RDBにだってJSON型があるし。なくても文字列型に入れることだって可能。
いっときはXMLが流行ったのだが、今はAWSのおかげかJSONをよく見るようになった。SQLポケリではXMLについては少しだけ載せているが、JSONについては「ほとんどない」。これは「いかん」時代に取り残されている感があるぞ、ということで、RDBにおけるJSONについて本ブログに書いて見るのである。
まずはJSON型のあるDBは?というと
1 Oracle
2 SQL Server
3 DB2
4 Postgres
5 MySQL
6 SQLite
なんとメジャーどころは全部JSON対応しているじゃない。
SQLiteについては型があってないようなものなので、厳密にはJSON型とはいえないかも知れないが、JSONデータを扱えるようになっている。
MS Accessについては微妙なところ。Access自身にJSON型は存在しないようだが、SQL Serverや他のDBを参照する場合にはJSON型をちゃんと認識するみたい。
ということで最近のRDBでは「JSONデータ型があるのが当たり前」という感じになっている。一時はnoSQLとか言われてたからねぇ。

そもそもJSONとは?

JSONって何というところから説明し出すと「きりがない」と思われるので、はしょって説明する。「JSONとは」でググってみると...
JSONとは「JavaScript Object Notation」の略で、XMLなどと同様のテキストベースのデータフォーマットです。
とでてきた。
つまりは、JavaScriptでデータを定義する時に使う文法が「JSON」であるわけです。以下はよくみるJSONの例。

{key: 'asai',value: 53}

配列や連想配列を扱うことも可能である。以下は配列の例。

[1,2,3]

配列は[]で囲む。連想配列は{}で囲む。
配列の中に配列や連想配列を入れても良い。いわゆるネストが可能。以下は2次元配列の例。

[
[1,2,3,4,5,6,7,8,9],
[2,4,6,8,10,12,14,16,18],
[3,6,9,12,15,18,21,24,27],
]

配列の中が連想配列の場合は以下のようになる。

[
{key: 'asai',value: 53},
{key: 'atsushi',value: 20},
]

こんな感じのデータをRDBに格納することができるのがJSON型ということになる。
しかしパッと見た目、JSONといっても普通のテキストデータとなんら変わりがないように思える。
JSON型にすると何が違うのだろうか、varchar型に突っ込んでもOKな気がするが...
もちろん、JSONデータをvarchar型の列に記録してもOK。けれどもJSON型に記録しておけば便利なことが多くあるのである。そうじゃなければわざわざJSON型なんて作らないわけだし。

データの整合性

JSONデータはただのテキストデータと違って文法がある。ひとつのJSONデータは{}または[]で囲まれている必要がある。以下の文字列データはどれもJSONデータにはなり得ないものである。

朝井 淳
(1,2,3)
{name: 'asai'

このような正しくないデータをデータベース内に持ち込ませないようにすることができる。これはRDBのデータ型について一般的に言われていることでもある。難しく言うとデータ型という制約を列の属性として与えることで、データの整合性、信頼性が高まることになる。簡単に言えば「変なデータが紛れ込まなくなる」ということになる。

SQLでJSONを操作

もうひとつの利点として、データベースの操作言語「SQL」でJSONデータを扱うことが可能になるといったことがある。JavaScriptだけを使っている状況であると、JSONデータから目的のデータを検索したりソートするにはJavaScriptで何かしらのコードを書いてやる必要がある。これって結構大変だったり、面倒だったりする。

検索やソートなら「SQLなら楽勝」って言う方も多いのでは?そっちの方が大変?

まぁ、苦手かどうかは置いておくことにして、とにかくSQLを使って、JSON配列の中からデータを探す、と言うことが可能になるのです。ね便利でしょ?
本日はこの辺まで。

投稿者プロフィール

asai
asai