【NoSQL】NoSQL(Not Only SQL) ~概要~

■ NoSQL

 * リレーショナルDB以外のデータベースソフトの総称
 * 機能を絞りスピード重視(SQLに比べて機能が少ない)
 * 短所もあるので、データのもつ特性によって、
  リレーショナルDBと使い分けることが必要(詳細は「リレーショナルDBとの使い分け」を参照のこと)

 特性

 長所

* 大量データを高速で処理可能

短所

* データの一貫性を保障する仕組みがない
* 必要なデータを指定して取り出すといった機能はない

 ■ NoSQLの種類

http://thinkit.co.jp/story/2011/02/03/1990?page=0%2C1

の図でイメージし易いかも。

【1】 キーバリュー型(KVS)

【特徴】

 * 一つのID(キー)に対し、いくつかの値(バリュー)を格納するだけの作り
 * 大量データの読み書きが高速で扱える

 製品例

 * memcached
 * TokyoTyrant
 * Flare
 * ROMA
 * Redis
 * Riak

【2】 列志向型(カラムナ)

 * 従来のDBの場合は、行指向でデータ処理するのに対して、列指向でデータを処理する。

【特徴】

 * 列方向のデータ操作に向く構造を持つ
 * 非定型データに強い

【利点】

 * 大量データを扱う時に、データ全体像を理解するために(例えば、購買する年齢層・地域など)、
  項目(列)ごとで扱う際に利用する場合に処理速度が速い

 製品例

 * HBase
 * Cassandra
 * HANA by SAP
 * Netezza by IBM
 * Exadata by Oracle

【3】 ドキュメント指向型

【特徴】

 * データ集計に強い

 製品例

 * CouchDB
 * MongoDB
 * RavenDB

 【4】 グラフ指向型

【特徴】

 * 多対多で複雑に関連付けられたデータを扱うのに特化

 製品例

 * Neo4j
 * Sones

 ■ リレーショナルDBとの使い分け

 NoSQL

 * 一貫性:不要
 * 結合:不要

【例】

 * ショッピングカートの内容(ユーザごとに分かれているので一貫性を保つ必要がない)

 参照用DB

 * 一貫性:不要
 * 結合:必要

【例】

 * ユーザ管理 
 * 購入履歴

 更新用DB

* 複数のユーザが同時に更新を掛ける場合 
 * 一貫性:不要
 * 結合:必要

【例】

 * 購入商品(商品の在庫の一貫性を保つ必要がある)

 ■ パフォーマンス比較

 * 別サイトの比較試験(参考までに見てみるのはいいかも)
 * サイトによってまちまち

 Cassandra / Mongodb / SQLite / H2 / MySQL / Postgres

 * SQLite が高速!!?

http://d.hatena.ne.jp/cypher256/20121013/p1
 memcached / Couchbase / MongoDB / Redis
http://mocobeta-backup.tumblr.com/post/36435137765/kvs-memcached-couchbase-mongodb-redis
 MySQL / memcached / TokyoTyrant / MongoDB / VoltDB
http://wall-climb.com/2012/03/28/nosql%E3%83%91%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%B3%E3%82%B9%E6%AF%94%E8%BC%83/
 MySQL(MyISAM, InnoDB) / memcached / TokyoTyrant / MongoDB / HBase
http://gihyo.jp/dev/serial/01/various-nosql/0006
 MySQL(MyISAM, InnoDB) / memcached / TokyoTyrant / MongoDB / Redis
http://yosuke-furukawa.hatenablog.com/entry/20110821/1313886186
 MySQL(MyISAM, InnoDB) / MongoDB
http://d.hatena.ne.jp/hiroppon/20131126/1385477732
 SQLiteとRedisでランキング(ソート)の速度
http://mocobeta-backup.tumblr.com/post/55339134454/sqlite-redis