Check! DBaaS ってなんだろう? IBM Cloudant を Bluemix で触ってみる。

こんばんは、[cloudpack][] の @dz_ こと[大平かづみ][]です。

Prologue - はじめに
====
本格的にアプリを作れるように、データを扱えるようになろう。

ということで、今回はNoSQLに慣れる目的で、[Bluemix](https://console.ng.bluemix.net/ "IBM Bluemix - Next-Generation Cloud App Development Platform") のサービスとして連携できる [IBM Cloudant](https://cloudant.com/ "IBM  クラウドで簡単に始められる大量データへの高度な分析") を利用してみます。

なお、お恥ずかしながら、リレーショナルデータベースを使った開発経験はあるものの NoSQL を扱った経験はないに等しいため、基本中の基本を進みますがご了承いただければ幸いです。
（過去に [CouchBase](http://www.couchbase.com/ "CouchBase") を使った開発に携わりましたが、主にMVCのV部分が担当だったため、あまりDBを意識することなく過ごしたのでした。)

Cloudant について
====
> Build More,
> Grow More,
> Sleep More
> Do more with the only fully-managed NoSQL database-as-a-service (DBaaS)

IBMが提供するNoSQLのフルマネージドデータサービス (DBaaS)です。（実際には2014年にIBMが買収）

特徴
----
[技術概要:IBM Cloudant DBaaS 徹底分析](http://www-01.ibm.com/common/ssi/cgi-bin/ssialias?subtype=ST&infotype=SA&htmlfid=IMW14781JPJA&attachment=IMW14781JPJA.pdf) より要約。

- クラウド上にデータを格納し、スケール可能 (=DBaaS)
- ローカルにインストールしての利用も可能
- JSONをはじめ、テキスト、地理的データなど格納可能
    - ファイル添付も可能
- REST APIでJSONやファイルを読み取り可能
- ウェブやモバイルアプリケーション、センサーからの断続的・継続的なデータ格納にも対応

いざ、Cloudant
====
Cloudant 連携アプリの準備
----
まずは、Bluemix で Cloudant を利用できるようにしましょう。

接続設定など煩わしいことは避けたいので、`Boilerplates` の `Node.js Cloudant DB Web Starter` でアプリを作成します。 この `Boilerplate` で作成したアプリには、 `Cloudant NoSQL DB`サービスと `Monitoring And Analytics`サービスがバインドされます。
![20150906_cloudant_000.png](https://qiita-image-store.s3.amazonaws.com/0/3812/1bf546fb-3d8b-e474-1f30-7e2810582a8a.png)

アプリの画面を見てみると、`Cloudant NoSQL DB`サービスがバインドされていることがわかります。
![20150906_cloudant_001.png](https://qiita-image-store.s3.amazonaws.com/0/3812/3557c196-b76a-f8a4-5c10-9909a3a906e0.png)

バインドされた `Cloudant NoSQL DB`サービスを見てみましょう。右上の `LAUNCH` ボタンをクリックすると、`Cloudant` のコンソール画面が開きます。
![20150906_cloudant_003.png](https://qiita-image-store.s3.amazonaws.com/0/3812/8a4b8fd0-8ce3-1134-0cba-a4878ca3bb6a.png)

Cloudant のコンソール画面です。 `Bluemix Cloudant NoSQL DB`サービスでは、クラウド上の `Cloudant DBaaS` と連携してくれます。
![20150906_cloudant_004.png](https://qiita-image-store.s3.amazonaws.com/0/3812/f1d2fd09-2375-90c9-1765-d382de5dd92c.png)

スターターアプリを試してみる
----
さて、スターターアプリで入力した情報がちゃんと `Cloudant` に保存されているか確認してみましょう。アプリを起動し、開いてみてください。

`Boilerplate` で作ったおかげか、`Cloudant NoSQL DB` 対応のスターターアプリがすでに置かれています。このキャプチャは、いくつか入力してみた状態です。
![20150906_cloudant_002.png](https://qiita-image-store.s3.amazonaws.com/0/3812/00df3be4-eed6-ac22-6d4a-032e45d82926.png)


このスターターアプリでは、カテゴリ毎にファイルを保存できるようです。

カテゴリにはファイルをアップロードでき、アップロードすると画面にリストアップされます。また、`ADD` ボタンを押せば、新しいカテゴリを追加できます。カテゴリにはディスクリプションも入力できます。

それでは、この入力した情報は、`Cloudant` のどこに格納されているのか見てみましょう。`Cloudant` のコンソールで、デフォルトで作られているDB `my_sample_db` を開いてみます。
![20150906_cloudant_005.png](https://qiita-image-store.s3.amazonaws.com/0/3812/973b31e8-62cf-a947-9e28-3cedc284dd1e.png)

`All Documments` ではドキュメント一覧が表示されます。ドキュメントの編集画面を開きます。
![20150906_cloudant_006.png](https://qiita-image-store.s3.amazonaws.com/0/3812/65a326fb-7f2e-8f84-f553-fd90106f9b3f.png)

入力したカテゴリの名前やディスクリプションが記録されていますね。また、 `_attachments` にアップロードしたファイル名が記載されています。 `content_type` などの情報がJSON形式で保存されていますね。
![20150906_cloudant_007.png](https://qiita-image-store.s3.amazonaws.com/0/3812/f146ae07-2b98-815c-1c4e-57bbfdbe2105.png)

はっ！

ファイル添付できるのか…？
----
ここで気づきました。このJSONの情報だけでは画像やテキストファイルは復元できないぞ…？

…なるほど！

Cloudant のドキュメントには、ファイルを添付できるんですね！（察しが遅い…(笑)）

ちょっと調べてみると、[Cloudant の開発者向けドキュメント](https://cloudant.com/for-developers/crud/ "Reading & Writing | Cloudant") にも、「File Attachments」の項がありました。

そして、保存されたファイルは REST API で取得できる、という便利さです。（実際にスターターアプリでも REST API を使ってサムネイルを表示しています。）

… 便利そう！！

Epilogue - おわりに
====
ということで、そろそろ日曜が終わりそうなので、本記事はいったんここまでとします。スターターアプリのソースコードの理解や、実際にコード書いてみるのは引き続き進めます。

しかし、ここで無知を発揮させて大変恥ずかしいのですが、ファイル添付できるのはびっくりしました。特に珍しいことでもないのかもしれませんが、今まで画像の扱いはストレージにアップしてそのURLなりをDBに保存するというアプローチだったので、新たな方法を知ることができてよい勉強になりました。

今一番疑問なのは、NoSQLのデータ設計（？）についてです。RDSでは正規化してリレーションはって、というのが当たり前ですが、NoSQLの場合はどうするのかなぁと、悩みながら続きを進めていこうと思います。


近況
====

最近
----
- [Check! Node.js Express でウェブ開発 with Visual Studio Code](http://qiita.com/dz_/items/f24b66f9f464b054dd1b/ "Check! Node.js Express でウェブ開発 with Visual Studio Code")
- [第4回 ICTトラブルシューティングコンテストの熱い戦いを拝見させていただきました！](http://qiita.com/dz_/items/979dc8e45e8bf5b66122 "第4回 ICTトラブルシューティングコンテストの熱い戦いを拝見させていただきました！") ← :new: :sparkles:

Bluemix 関連
----
- [Check! Bluemix で Node.js をスピーディーに開発したい！](http://qiita.com/dz_/items/50949f47ad8e09e491a3/ "Check! Bluemix で Node.js をスピーディーに開発したい！")
- [Check! DBaaS ってなんだろう? IBM Cloudant を Bluemix で使ってみる。](http://qiita.com/dz_/items/ee02ec8144784cface95/ "Check! DBaaS ってなんだろう? IBM Cloudant を Bluemix で触ってみる。") ← :new: :sparkles:

Webフレームワーク関連
----
### Phalcon PHP Framework
- [爆速フレームワーク!! Phalcon PHP Framework](
http://qiita.com/dz_/items/55ae18f7fe3a873bace1 "爆速フレームワーク!! Phalcon PHP Framework")
- [Meet Volt ! Phalcon 謹製テンプレートエンジン Volt - from 第71回 PHP勉強会](http://qiita.com/dz_/items/974a90b32ba6a6e38182 "Meet Volt ! Phalcon 謹製テンプレートエンジン Volt - from 第71回 PHP勉強会")
- [Meet Phalcon! - Phalcon PHPフレームワークを Nginx on Amazon EC2 にインストール！](http://qiita.com/dz_/items/e70d61487224b854b971 "Meet Phalcon! - Phalcon PHPフレームワークを Nginx on Amazon EC2 にインストール！")

### その他
- [[初メモ] はじめての Tomcat 〜 つまづいたところまとめ (Java のバージョン指定、起動パラメータ など)](http://qiita.com/dz_/items/879ca03b5b594007ceab "[初メモ] はじめての Tomcat 〜 つまづいたところまとめ (Java のバージョン指定、起動パラメータ など)")
- [Check! はじめての CakePHP2 ポイントまとめ 〜 Blog Tutorial を動かそう](http://qiita.com/dz_/items/2dd4c68f43484f0f78da "Check! はじめての CakePHP2 ポイントまとめ 〜 Blog Tutorial を動かそう")
- [Check! はじめての CakePHP2 〜 bake でプロジェクトスケルトンを利用する](http://qiita.com/dz_/items/3fa2a7a184de645f71d4/ "Check! はじめての CakePHP2 〜 bake でプロジェクトスケルトンを利用する")

クラウド・インフラ関連
----
### Amazon Web Services
- [Check! はじめての fluentd を Amazon Linux で動かしてみる (ログを PHP から送る)](http://qiita.com/dz_/items/960319ffffa0d7355f8c "Check! はじめての fluentd を Amazon Linux で動かしてみる (ログを PHP から送る)")
- [Check! はじめての Fluentd 〜 IAMロールで Amazon EC2 と S3 間をセキュアに](http://qiita.com/dz_/items/224607c84112ccafa2d6 "Check! はじめての Fluentd 〜 IAMロールで Amazon EC2 と S3 間をセキュアに")
- [Check! はじめての Zabbix インストール on Debian x Amazon RDS](http://qiita.com/dz_/items/3e85dd369c8053ceffe8 "Check! はじめての Zabbix インストール on Debian x Amazon RDS")

### Azure
- [Check! Azure オートメーション ランブックで OMS Search API を利用する (和訳)](http://qiita.com/dz_/items/7de3c282adef71aae7c6/ "Check! Azure オートメーション ランブックで OMS Search API を利用する (和訳)")


技術ブログ寄稿
----

[cloudpack技術ブログ][cloudpack-blog]でも記事を書いています。

- <a href="http://blog.cloudpack.jp/author/oohira/" title="大平 かづみ の記事一覧 | cloudpack技術情報サイト"　target="_blank" rel="nofollow">大平 かづみ の記事一覧</a>

[cloudpack]:https://cloudpack.jp/ "cloudpack（クラウドパック） 400社を超える導入実績! EC2などAWSクラウドの導入設計、構築、運用保守サービス"
[cloudpack-blog]:http://blog.cloudpack.jp/ "cloudpack技術情報サイト"
[大平かづみ]:http://blog.cloudpack.jp/author/oohira/ "大平かづみの記事一覧"