NoSQLとは(Fire Storeも解説)

## 目標
・NoSQLの概要、RDBとの違いを理解する
・Fire Storeの概要を理解する
・分散DBとブロックチェーンの違い（おまけ）

## 前提知識
RDB(リレーショナル データベース)は、1つのDBに複数のテーブルが存在しており、それらが繋がって機能するDBのことです。  

テーブルに関して、視覚的にはExcelをイメージしてもらうと分かりやすいかもです。
横列をレコード、縦列をフィールドと呼び、1つのデータを1レコードと呼びます。
そのレコード(データ)が蓄積される塊をテーブルと呼びます。

代表例としては、MySQLやOracleがあります。
正確には、RDBではなくRDBMS(リレーショナル データベース マネジメント システム)になります。
要は、RDBを管理するためのシステムのことです。

## NoSQLとは
本題に入ります。  
NoSQLとは簡単に言うと、RDB以外のDBのことです。  
略称としては、SQL文を使わないという意味ではなく、SQL文に限定されない(＝Notonly)という意味です。

一口にNoSQLといっても、複数種類があるので解説します。

### キー・バリュー型
キーとバリューのみ保存する、極めてシンプルなDBです。

Excelだと横2列のみのイメージです。
新しいデータが保存されると、下に蓄積されていきます。
スケーラビリティに優れており、大量処理が得意です。
![4E689FB5-1401-4A67-9FA4-904F453B23CA.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/783286/198f7f1c-fd6c-0f10-5b90-1a105c54c3cd.jpeg)
代表例 : Redis, Riakなど


### カラム型
RDB同様、1つのキーが複数のカラムを保持できます。
RDBとの違いとして、カラムに可変性があり、動的にカラム追加をすることができます。
他のレコードには存在しないカラムを追加することも可能です。
![CCE81A44-F7F5-495A-9C64-FF4714CDEE54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/783286/a58400e7-07a0-c783-1f9b-04052041c2be.png)
代表例 : Cassandra, HBaseなど


### グラフ型
関係性を持つデータを保存するDBです。
RDBとは異なり、1レコードに関係性を示したデータを挿入するイメージです。

・ノード(誰が)
・エッジ(誰と)
・プロパティ(どんな関係)
上記3つのデータを1データとして保存します。

実用例としては、ナビなどの最短経路を導き出す時に用いられます。
![F69C1440-31A5-4198-88D8-8520B3D889FD.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/783286/03eb922b-5f02-a2e0-c240-1e81667f8edc.jpeg)
代表例 : Neo4j


### ドキュメント型
JSONやXML形式のデータを保存するDBです。

(例：JSON)

```
{
 "key" : value,
 "key" : value,
 "key" : value
}
```

データの性質や形式に変更があっても、ドキュメント形式で保存して処理を行う事ができます。
![1100181F-8202-4101-B8EF-0BD2EFDD20F9.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/783286/3082f975-7ed4-cfa6-476f-6e6163fe9a0f.jpeg)
代表例 : MongoDB, Couchbaseなど


## RDBとNoSQLの違いとは
大きな違いとして下記があります。
・データの構造、参照
・トランザクション

#### データの構造、参照
RDBは、複数のテーブルと関係を持ち、スキーマ定義(型定義)を行い複雑な構造を実現しています。
SQL文を用いて、複雑な条件での参照が可能です。

NoSQLは、データの定義や関係性もありません。柔軟性は高いですが、複雑な参照や検索などは不向きです。

#### トランザクション
RDBは、データ不整合が起きないようになっており、処理中にエラーが起きると処理前の状態に戻します。
DB設計の段階で行う、関係性の定義に従います。

NoSQLは、分散DBにした場合にトランザクションが効きます。
形式は結果整合性になっています。
結果整合性とは、データが更新された際に、一定時間経過後には最終的な一貫性が担保されるという考え方です。

わかりやすく言うと、データが更新された時、A (DB)の値は更新されているが、B (DB)の値は更新されていない状況があり得る。
一定時間経つと同期されるが、それまでは最新の情報かは保証されないよ。ということです。
![結果整合性.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/783286/ab120ab6-467d-1675-0709-0ce7002d01dd.png)


## Fire Storeとは
個人的に勉強したかった内容なので、特別にFire Storeも解説します。

Fire Storeとは、Googleが提供しているNoSQLです。
上記だと「ドキュメント型」に当てはまります。

概念としては、「コレクション」と「ドキュメント」を駆使して設計します。
コレクションというディレクトリのようなものがあり、その中にドキュメントを保存していきます。
ドキュメントの中に更にコレクションを作成することも可能です。
これをサブコレクションと呼びます。

```
rooms (コレクション)

  first_user (ドキュメント)
    name : "yamada"
    age  : "20"
    first_messages (サブコレクション)
      messages (ドキュメント)
        first_msg : こんにちは

  second_user
    name : "tanaka"
    age  : "21"
    secound_messages
      messages
        first_msg : おはよう
```
上記のような形で保存していきます。
また、スキーマ定義不要なので自由な型を保存することができます。

具体的なソースコードなどは割愛します。（勉強して記事を書きます...）

## 分散DBとブロックチェーンの違い（おまけ）
分散DBを調べていたところ、ブロックチェーンと似てる...?
となったので調べてみました。

下記が主な違いです。
・サーバーの存在
・改竄耐性
・ダウンの危険性


分散DBの場合、クライアントとDBの間にサーバーが存在しており、管理者的な役割を担っています。
ブロックチェーンの場合は、Peer-to-Peer (P2P)という形式で、Peer (別名:ノード)同士がやりとりを行なっているそうです。
Peerというのはクライアントに当たります。

分散DBはCRUDで自由に処理を行える一方、ブロックチェーンはCRしか行えません。
変更をするときは、変更したデータ（ブロック）を追加（C）する必要があります。
さらに、最終追加ブロックのハッシュ値と呼ばれるものを、新しいブロックに記載するため、時系列が明確になり改竄のリスクが殆どありません。
このように、ハッシュ値よりブロック間で鎖にように繋がっていることが「チェーン」と呼ばれる由来です。

前述したように、サーバーも存在しないことからダウンする可能性もありません。
そこも分散DBとの違いです。

そもそも、使用目的が違うので比較対象になるのか微妙ですが、以上が調べて分かったことです。

## あとがき
勉強がてらの執筆なので、曲解している点などありましたらコメント下さると幸いです。

##### 画像引用
<https://tech-blog.rakus.co.jp/entry/20180919/nosql/bigdata>
<https://shinkufencer.hateblo.jp/entry/2018/12/30/233000>