Takahiro Octopress Blog

-1から始める情弱プログラミング

NoSQLの特性を調べよう!

| Comments

NoSQLとは

本日は珍しくiOS以外について書きます。
今やそんなに目新しい技術ではなくなってきたNoSQLですが、改めてどんなものか復習してみようと思います。
筆者が馴染みのあるNoSQLはMongoDBとRedisくらいなのでまだまだ知らないことも多く、一度まとめてみます。

NoSQLとは「Not only SQL」の略でMySQLやOracleなどの所謂RDBMSではないデータベースを指します。
その名の通りSQLは使いません(SQL相当のものはあったりします)

NoSQLの代表例

NoSQLには様々なものが存在します。
特によく取り上げられるものを見ていきましょう。
(今回取り上げるのはオープンソースなものに限ります。)

MongoDB

筆者が最も馴染みのあるNoSQLはMongoDBです。
普通ならあり得ないかもしれませんが、筆者にとって初めて触れたデータベースでもあります。

【概要】

  • ドキュメントと呼ばれるJSONっぽいデータ構造でデータを保存する
    • JavaScript好きな人には見やすいデータ形式
    • サーバサイドもJavaScriptで書きたいNode.js好きな人が寵愛するポイントでもある
  • ドキュメントの集合をコレクションと言う
    • RDBMSのテーブルのイメージで考えればRDBMSしか触っていない人も理解しやすい
  • データベースに直接JavaScriptを流し込むことができる
  • CRUDクエリが高速
    • 筆者の中では特にinsertが得意なイメージ
  • v3.0からパフォーマンスが大幅に改善されている
    • 昔MongoDBを見限った人は再度見ることを勧める

【用途】

  • WEBシステムでの利用
    • 結局、RDBMSでないと…みたいな意見もあるが、割りと実例多いし普通に使える
  • 位置情報系サービスでの利用
    • 位置情報関連のIndexが充実して使いやすいイメージ
  • 大量データの蓄積に利用
    • ログの蓄積として活躍できる
    • NoSQLがそもそもビッグデータに最適な作りになっているパターンが多い

Redis

続いて馴染みのあるNoSQLがRedisです。

【概要】

  • メモリ上にKVS(key-value store)を構築する
  • メモリ上にデータを持つのでRead/Write共に高速
  • ディスクにも定期的にデータを保存するがリアルタイムではない

【用途】

  • キャッシュ用のDBとして利用
    • セッション情報の格納で使われることはかなり多い
    • WebSocketを使ったリアルタイムな処理にも向いている

CouchDB

今まで触ったことのないDBですが、調べてみました。
MongoDBに似ているイメージだったのですが、全然違うんですね…

【特徴】

  • ドキュメント指向データベース
    • JSON形式でデータ保存
    • MongoDBと同じくデータをドキュメントと呼ぶ
  • RESTful APIでCRUD操作
    • DBに馴染みがないと逆に入りやすい特徴かもしれません
    • URIでドキュメントがマッピングされている

【用途】

  • ローカルストレージとして利用
    • iOSやAndroidアプリ内のローカルストレージとして利用する
  • 1リクエストで単体データを取得する場面
    • まさに紙ドキュメントをPDF化したようなデータを格納して、URIマッピング特性活かすような場面

あまり複雑なデータ構造に適しているようには思えなかったのが正直なところです。
NoSQLどころかRDBMSにも馴染みがない一方でAPサーバ周りの構築はしたことがある人が触るときにとっつきやすそうなイメージを持ちました。

Cassandra

これまた触ったことのないDBですが、調べてみました。

【特徴】

  • 分散型データベースシステム
    • 列指向型
    • KVSの一種でもある
  • リッチなデータモデルを持つ
    • データの最小単位をカラムと呼ぶ
    • カラムの集合をスーパーカラムと呼ぶ(5次元配列として持つ場合のみ)
    • RDBMSで言うところのテーブルに当たるのがカラムファミリ
  • 耐障害性が高い
    • マスターノードのないアーキテクチャ
    • データは各ノードに分散や複製されるためデータ損失のリスクも低い
  • 世界的に有名な企業がこぞって利用
    • Facebook, Twitter, Adobe, Cisco, Netflix など

【用途】

  • DBを止めたくない耐障害性を求められるシステム
  • 超大規模案件
    • そもそもFacebookでその用途で開発されていたし…
    • Twitterでも新着ツイートのデータ格納に使われていたとか…
    • データマイニングとか分析系に強そう

Cassandraはかなり堅牢かつ大規模サービスでの利用に最適なイメージを持ちました。
逆に特性を知っていないと持て余しそうなくらい…

最後に

さて如何でしたでしょうか?
結局、興味があるものに少し触れただけになってしまいましたが、筆者自身の見解も広がりました。
MongoDBやRedisも中途半端にかじって終わってる感があるのでもっと勉強したいと思っていましたが、Cassandraとかかなり実用途ありそうなのでだいぶ興味を惹かれました。
一方でそんな大規模なサービスを日本企業初でやることって世界に比べたら相当少ないんだろうなと思いました。
ま、機会を見つつ1つ1つ身につけていければ良いかなというところで本日はここまで。

Comments