NoSQLデータベースとは?
関係データベース(リレーショナルデータベース)以外のデータベースのこと。
SQLは関係データベース用の言語であることから「SQL=関係データベース」と捉え、逆に「NoSQL=非リレーショナル」といった認識。
※人によってNoSQLの捉え方が「non SQL」「not only SQL」など少し異なる場合もある。
関係データベース(リレーショナルデータベース)とは?
行と列から成る、表形式のテーブル型データベースのこと。
例:MySQL、PostgreSQL、Oracle
NoSQLデータベースの特徴
柔軟性が高い
何を基準に柔軟性が高いと言っているかというと、関係データベースシステム(以降、RDBMS)と。
RDBMSでは、テーブルのカラムや格納できるデータ型などを最初に定義し、それに合致したデータしか格納できない。一方、NoSQLは各データに合わせて変更できる。
その結果、NoSQLデータベースは、半構造化データ・非構造化データの扱いに適していると言われる。
構造化データ・非構造化データ・半構造化データとは?
構造化データ:構造が決まっているデータ。RDBMSで扱えるデータはコレ。Excelなどの表データも該当する。
非構造化データ:データ構造がないデータ。画像・メールなど規則性のないテキストが該当する。
半構造化データ:大体データ構造は決まっているが、柔軟性をもつデータ。
水平スケールアウトの容易性
分散システム上で大規模拡張できるように設計されています。
水平スケーリングとは?
サーバーの数を増減させることで、性能向上・負荷への耐久力をアップさせる方法。サーバー数を増やすことをスケールアウト、減らすことをスケールインという。
一方、垂直スケーリングは、部品を変えるなど機器自体の性能を高めて、性能や負荷への耐久力を向上させる。
NoSQLデータベースの種類
これまでで4種類ほどのNoSQLデータベースが登場している。
表形式のテーブル型でなければNoSQLデータベースなので、今後も新しい種類が増えるかも?
キー・バリュー型データベース
データをキー・バリューの形で格納するデータベース。水平スケーリングもしやすい。
- 適する用途:大量のデータを保存する必要がありつつ、その取得に複雑なクエリを実行する必要がない場合。例:ユーザー設定の保存、キャッシュ
- DB例:redis
// redis
SET server:name "taro" // nameキーにバリューをセット
GET server:name // "taro" nameキーのバリューを取得
EXISTS server:name // 1 存在するキー
EXISTS server:wow // 0 存在しないキー
ドキュメントデータベース
JSONオブジェクトのようなドキュメントにデータを保存するデータベース。コードで使用するオブジェクトに合わせて、保存するデータ構造を決めることができる。水平方向のスケールアウトもしやすい。
- 適する用途:時間の経過とともにデータが変化する可能性がある場合。例:カタログ、Eコマース
- DB例:MongoDB
// MongoDB
// usersコレクション(usersデータのまとまり)にドキュメント(1userのデータ)挿入
db.users.insertOne(
{ name: "taro", birth_day: { year: 2000, month: 12, date: 24 }, favorite: ["banana", "car", "chocolate"] }
)
// usersコレクションから任意のドキュメント取得
db.users.find({name: "taro"})
カラム(列)指向型データベース/ワイドカラムストア
行ごとに任意のカラム数を持つことができるデータベース。列方向の処理が高速。
Googleが出したBigtableの論文が元になっている。
グラフデータベース
ノードとエッジにデータを保存する。ノードは物事に関する情報を保存する一方、エッジはノード間の関係の情報を保存する。
- 適する用途:関係を横断した処理を行う必要がある場合。例:ソーシャルネットワーク、不正検出、推奨エンジン
- DB例:Neo4j、JanusGraph
グラフと言っても、線グラフ・円グラフなどではなく、グラフ理論のこと。
ノードとエッジというのは、グラフ理論における概念で、図で表すとこんな感じ。

まとめ
NoSQLと言っても、その種類や特性は様々で、もし採用するときは適性を見極める必要があるなと思った。また、NoSQLの長所である柔軟性はメリットにもデメリットにもなりうるから、RDBMSともうまく使い分けていくのが大事そう。