NoSQL入門

# はじめに
こちらの記事はNoSQLを勉強した時の備忘録です。RDBMSとの違いや、NoSQLを使う事によるメリットなどを記載したいと思います。

# NoSQLとは何か
NoSQL = Not only SQLの略。

**関係データベース管理システム（以下RDBMS）以外のデータベース管理システムの総称**です。
![Untitled Diagram.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290687/1f2d3ef7-376d-fc81-e98d-9f9ca65b3799.png)

## NoSQLの特徴

**スキーマレス**
NoSQLはスキーマを定義しないでデータを格納することができます。
RDBMSにおけるスキーマとは、データベースの構造です。以下はwikipediaからの引用です。

>関係データベースでは、スキーマは関係 (表) と関係内の属性 (フィールド) 、属性や関係の関連の定義である。
>https://ja.wikipedia.org/wiki/%E3%82%B9%E3%82%AD%E3%83%BC%E3%83%9E_(%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9)

**結合が無い**
他データとの関係を持たないため、NoSQLには結合がありません。
結合が無いことによってパフォーマンスの向上が見込めます。

**トランザクションが無い**
RDBMSではおなじみのトランザクションが無い場合が多いです。
トランザクションは、分離できない複数の処理を1つにまとめたものです。トランザクションによって、複数の処理を行った場合のデータの整合性を正しく保ちます。

## NoSQLの種類
NoSQLの種類は大きく分けてデータモデルとアーキテクチャがあるようです。

### データモデルによる違い
データをどう保管するかの違いです。

#### キーバリューストア型(KVS)
キーとそれに対応する値を格納するタイプ。

| key | value     |
|----|----------|
| 1 | aaaa |
| 2 | bbbb |
| 3 | cccc |

**代表例**

- redis
- memchached
- dynamodb

#### ドキュメント型
JSON形式に代表されるような階層構造を持ったデータを取り扱う。

```json
[
  {
    "名前": "鈴木",
    "情報": { "生年月日":"1990年1月20日", "性別": "男" },
    "趣味" : [ "映画", "音楽", "ドライブ" ]
  },
  {
    "名前": "佐藤",
    "情報": { "生年月日":"1990年5月1日", "年齢": 29, "住所":"東京都豊島区" },
    "趣味": [ "ビリヤード", "映画" ]
  },
  {
    "名前": "田中",
    "情報" : { "身長":172, "出身": "東京"},
    "職歴": [ "SE", "営業" ]
  }
]
```

**代表例**

- MongoDB
- CouchDB

#### カラム型
1つのkeyに対して、複数のカラムを持たせることができ、リレーショナルモデルに近いデータ構造を持つことが出来る。

![test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290687/f5be8b57-f95b-9d6d-0c97-1903d7184c90.png)

**代表例**

- Cassandra
- HBase

#### グラフ型
データをグラフで表現するタイプ。
![Untitled Diagram (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290687/d3f365e1-bc86-ea40-08f0-b1c4ab7106a9.png)

**代表例**

- Neo4j

### アーキテクチャによる違い
#### マスタ型
マスタノードが配下のノードを管理するパターン。マスタノードが停止するとシステムも停止する。
RDBMSでもマスター/スレーブの構成があるが、あれと同じようなものだと認識しています。

![Untitled Diagram (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290687/749eb81e-5dfe-1358-3ca8-6e8323991842.png)

#### P2P型
配下などの概念がなく対等にお互いを管理する。
RDSのMultiAZのような機構だという認識。

![Untitled Diagram (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290687/dd9b4675-8903-b7c5-85f8-93baf27e9c5c.png)

# なぜNoSQLを使うのか
NoSQLのメリットについてまとめてみたいと思います。

## 非構造化データを格納するのに向いている
NoSQLは非構造化データを格納するのに向いています。それに対して、RDBMSは構造化データを取り扱うのに向いています。

>非構造化データ (Unstructured Data) とは、構造定義されておらず、主に関係モデルにうまく適合しないデータモデルに分類されるデータを指す。
>https://ja.wikipedia.org/wiki/%E9%9D%9E%E6%A7%8B%E9%80%A0%E5%8C%96%E3%83%87%E3%83%BC%E3%82%BF

非構造化データに分類されるのは以下のようなものがあります。

- XMLファイル
- JSONファイル
- テキストファイル
- 画像ファイル

故に、非構造的なデータであるビッグデータを扱うのに向いているでしょう。

## パフォーマンスの性能が良い
NoSQLはそのシンプルの作りから、RDBMSに比べ高速です。NoSQLにはトランザクションや結合がないのもその要因となっています。

特にキーバリュー型は、非常に高速な読み書きが可能になります。

## スケールアウトがしやすい
スケールアウトは、**システムを動作させるサーバの台数を増やすことで、処理能力を高めることです。**

RDBMSでは、データの整合性が必要とされるため、サーバの台数を増やすと、それだけ整合性が保てなくなる可能性が高くなります。

一方、NoSQLでは、データの整合性を考えず、柔軟で高速な処理を実現しています。整合性を気にしなくても良いということはスケールアウトもしやすいということだと認識しています。

# NoSQLのデメリット
RDBと比べた場合のNoSQLのデメリットについて書いていこうと思います。

## 整合性が担保されない
NoSQLの場合、結合をサポートしていないものも存在し、データのコピーが必要になり、冗長性が生まれやすくなっています。
その中で、データの更新などが発生した場合、一方では更新がされ、もう一方では更新が漏れていたということは往々にして存在します。

その場合、データの一貫性がない状態に陥り、どちらのデータが正しいのか判別が困難になります。

## 検索能力が比較的低い
NoSQLでは、結合やトランザクションなどの仕組みがないものが多いので、複雑な検索に耐えられないというデメリットも存在します。

# 参考サイト
- [非エンジニアでも知っておきたいビッグデータとデータベースの話【NoSQL解説】](https://community.mapr.jp/nosql-topic-bigdata-and-database.html)
- [エンジニアが知っておくべきNoSQLの概要と主要OSSプロダクト](https://tracpath.com/works/development/nosql_overview/)
- [NoSQLデータベースの長所と短所 (1/2)](https://www.atmarkit.co.jp/ait/articles/1709/29/news001.html)
- [RDBエンジニアのための10分でわかるDocumentDB](https://www.nttpc.co.jp/technology/documentdb.html)
- [IoTに適したNoSQL・分散Key-Valueストア](https://thinkit.co.jp/story/2014/09/25/5280?page=0%2C1)
- [NoSQL とは](https://aws.amazon.com/jp/nosql/)
- [NoSQLのデータ構造とアーキテクチャによる分類](https://blog.takanabe.tokyo/2015/09/05/1333/)
- [NoSQLについて勉強する。](https://qiita.com/t_nakayama0714/items/0ff7644666f0122cfba1)
- [NoSQLはRDBより速くて高機能なの？ NoSQLについて抑えてほしいポイント](https://www.gixo.jp/blog/11676/)
- [RDBMSとNoSQLを徹底比較！特徴からそれぞれのメリット・デメリットまで、わかりやすく解説！](https://www.geekly.co.jp/column/cat-technology/1904_005/)