各種DBシステムの概要　RDBMSとNoSQL

勉強を兼ねて、主要DBの種類と特徴についてまとめた。

# RDBMSとNoSQL

## RDBMS (Relational DataBase Management System)
DBMSの主流。データを表形式で表す「関係モデル」に基づいている。

## NoSQL (Not only SQL)
RDBMSの弱みを補う目的で開発されたデータベースの総称。

主に次の4つのタイプに分けることができる。

**Key-Value Store型**

データがすべてインデックス付きキーと値で構成される。スキーマレス。
高速な読み書きができるが、複雑な検索処理には向いていない。

**列指向型**

データは列単位で管理される。大容量データに対して検索を行う場合など、
処理の負荷が高くRDBMSが苦手とする場面でも、高速な読み書きができる。
　
**ドキュメント指向型**

Key-Value Storeの考え方を拡張したもの。
複雑なデータをそのままドキュメントに格納し、各ドキュメントに一意のキーを割り当てる。
スケーラビリティが高く、サーバを追加しやすい。

**グラフ指向型**

グラフ理論に基づいて、ノード・エッジ・プロパティで構成されるグラフ構造でデータを格納する。
データ同士の複雑な関連性を表現でき、頻繁に更新される大量のデータを効率よく扱うことができる。

## それぞれの強みと弱み

|  | RDBMS | NoSQL |
|----------------|-------------------------------------------------------------------|-------------------------------------------------------------------|
| データ定義 | どんなデータが入るのかを事前に理解しておく必要があるが、データ同士の関連性を保持できる | データ型の定義が必要ないため、当初意図していたものと異なる型のデータを扱うこともできるが、データ同士の関連は表現できない |
| データの一貫性 | ○ トランザクションの仕組みがある | × 堅牢なトランザクションは、サポートしていないものが多い |
| 読み書き | × 速くない | ○ 速い |
| 検索 | ○ SQLを使用し、テーブルを結合しての複雑な検索ができる | × SQLが使えないので、条件を指定した検索などが苦手 |
| 拡張性 | × データ構造をあらかじめ定義しているため、拡張にはコストがかかる（長時間ロックがかかる可能性もある） | ○ シンプルなデータ構造で、スキーマレスのものも多く自由に拡張できる |
| スケールアウト | × データの一貫性を保つために書き込み部分を分散させることはできない | ○ データの一貫性を一部犠牲にしているので分散させることができる |

簡単にまとめると、
RDBMSの売りは「データの一貫性」であり、NoSQLの売りは「スピードと柔軟性」だと言える。

# RDBMSに分類されるDB

#### MySQL

<dl>
  <dt>開発元</dt>
  <dd>MySQL AB社が主体となって開発した。</dd>
  
　<dt>特徴</dt>
  <dd>
    PostgreSQLと同様、各種開発言語用のAPIが用意されている。<br>同時に複数人が利用するようなWebアプリケーションなどのシステムに適している。
  </dd>

　<dt>用途・実績</dt>
  <dd>オープンソースCMSや個人向けレンタルサーバでも多く採用されていて、<br>個人ユースでも広く利用されている。</dd>

　<dt>ライセンス</dt>
  <dd>無償のCommunity Server、有償のEnterprise Serverという2つのライセンス形態がある。</dd>
</dl> 

#### PostgreSQL

<dl>
  <dt>開発元</dt>
  <dd>カリフォルニア大学のプロジェクトにより開発された。</dd>
  
　<dt>特徴</dt>
  <dd>商用のRDBMSに匹敵するほど高性能で、<br>企業システム用途での利用を意識して強化が進められている。</dd>

　<dt>用途・実績</dt>
  <dd>
    特に日本で、企業システムに使用されている。
  </dd>

　<dt>ライセンス</dt>
  <dd>BSDライセンス</dd>
</dl>

#### SQLite

<dl>
  <dt>開発元</dt>
  <dd>D. Richard Hipp氏らによって開発された。</dd>
  
　<dt>特徴</dt>
  <dd>軽量なRDBMSで、大規模なシステムには不向き。<br>データの保存に単一のファイルのみを使用していて、<br>APIは単純にライブラリを呼び出すだけというシンプルな構成になっている。</dd>

　<dt>用途・実績</dt>
  <dd>Android、iOSで標準搭載されている。</dd>

　<dt>ライセンス</dt>
  <dd>パブリックドメイン</dd>
</dl>

# NoSQLに分類されるDB

#### Cassandra

<dl>
  <dt>開発元</dt>
  <dd>Facebook社で、大規模データ格納の目的で開発された。</dd>

　<dt>タイプ</dt>
  <dd>列指向型</dd>
  
　<dt>特徴</dt>
  <dd>Amazon Dynamoの分散ハッシュテーブルと、<br>Google Big Tableの列指向データモデルを取り入れて設計された。<br>データモデルは「キースペース」「カラムファミリー」「キー」「スーパーカラム」<br>「カラム」の5要素から構成される。（イメージ図を下部に記載。）<br>同一の機能とデータを持つ複数のノードを分散させた「クラスタ」でデータを保持し、<br>クライアントはどのノードに対しても読み書き可能なうえ、<br>障害が発生した場合にデータが失われるリスクを抑えられる。
</dd>

　<dt>用途・実績</dt>
  <dd>Digg、Hulu、Facebook、Twitterなど</dd>

　<dt>ライセンス</dt>
  <dd>Apache License v2.0</dd>
</dl>

![cassandra.png](https://qiita-image-store.s3.amazonaws.com/0/55862/f11c0b33-22f8-4742-8b5a-815a7d2b9c77.png)

 
#### MongoDB

<dl>
  <dt>開発元</dt>
  <dd>MongoDB Inc.によって開発とサポートが行われている。</dd>

　<dt>タイプ</dt>
  <dd>ドキュメント指向型</dd>  

　<dt>特徴</dt>
  <dd>スキーマ（テーブル定義）をもたない。<br>「ドキュメント」と呼ばれる構造のデータをJSONライクな形式で表現し、<br>ドキュメントの集合を「コレクション」として管理する。<br>JOINが使えないことと、トランザクションをサポートしていないこと以外は、ほぼRDBMSと同じように使える。<br>更新可能な1台のマスターと、その複製である読み出し専用の複数台の<br>スレーブという構成が可能。</dd>

　<dt>用途・実績</dt>
  <dd>foursquare、bit.ly、sourceforgeなど</dd>

　<dt>ライセンス</dt>
  <dd>GNU AGPL v3.0（ドライバはApache License v2.0）</dd>
</dl>


#### Redis

<dl>
  <dt>開発元</dt>
  <dd>Salvatore Sanfilippo氏が開発を始め、2010年からVMWareが支援を行っている。</dd>

　<dt>タイプ</dt>
  <dd>Key-Value Store型</dd>  

　<dt>特徴</dt>
  <dd>全てのデータセットをメモリ内に読み込むので、非常に高速なデータアクセスが可能。<br>しかし、データ容量には制限がある。<br>マスター・スレーブ構成ができる。<br>現在も有志によって開発が進められている。</dd>

　<dt>用途・実績</dt>
  <dd>DeNA、サイバーエージェント、ニコニコ動画、LINE、github.com、flicker.com、instagram.comなど</dd>

　<dt>ライセンス</dt>
  <dd>BSDライセンス</dd>
</dl>

# 参考にさせていただいたサイト

* [I-22-2. RDBMSの特徴、関係モデルとSQL | 日本OSS推進フォーラム](http://ossforum.jp/node/709)
* [II-22-8. オープンソースRDBMSの種類と特徴 | 日本OSS推進フォーラム](http://ossforum.jp/node/1036)
* [RDBMSとNoSQLのメリット・デメリットについて - 酒と泪とRubyとRailsと](http://morizyun.github.io/blog/rdbms-nosql-merit-demerit/)
* [RDB開発者におくるNoSQLの常識（1）：NoSQLはRDBMSに取って代わるものなのか？ (1/3) - ＠IT](http://www.atmarkit.co.jp/ait/articles/1102/24/news098.html)
* [主要NoSQLの種類と特性を整理--分散DBMS「Cassandra」も解説 - builder by ZDNet Japan](http://builder.japan.zdnet.com/db-sql/35012622/)
* [第4回　スキーマレスで柔軟に扱えるMongoDB：NoSQLデータベースを試してみる｜gihyo.jp … 技術評論社](http://gihyo.jp/dev/serial/01/various-nosql/0004)
* [MongoDB - Wikipedia](MongoDB - Wikipedia)
* [NoSQL データベース比較](http://pontium.org/bc/landing/landing.html)
* [Redis勉強会資料](http://www.slideshare.net/yujiotani16/redis-26851700)