【swift4】Firebaseのデータベース「Firestore」の解説

## はじめに

どうも。[とがみん](https://togamin.com/)です。

現在セブ島のNexSeedというプログラミングと英語を勉強できる学校で、ティーチングアシスタントとして、インターンしています。

生徒が作りたいアプリを開発するにあたって、つまりそうな点や必要な機能を先回りして実装して、ヒントをあげたり、授業として解説したりしています。

今回は、「Firebase」に関して調べたこと、また、そのサービスの一つである、「Firestore」について紹介しようと思います。

## Firebaseとは

FirebaseとはGoogleが提供するサービスの一つで、iOSアプリ等のアプリケーションを作成する際に、主にユーザーから見えない処理をクラウド上で提供してくれるサービスです。

アプリを使う上で、ユーザーを識別するための「ユーザー認証機能」、あらゆる情報を保管しておく「データベース」、アプリユーザーに対して、様々な情報を送ることができる「プッシュ通知機能」がアプリを開発する上で、よく使う機能だと思います。

このFirebaseというサービスを使うことによって、上記のような、ユーザーから見えない処理を簡単に実装することができ、個人でわざわざサーバーのセットアップやメンテナンスをする必要がありません。

[＞Firebase](https://firebase.google.com/?hl=ja)

今回はFirebaseがもつ機能の中で、「Firestore」というデータベースについて書いて行こうかと思います。

## Firestoreとは

**Firestore**は、**NoSQLドキュメント指向データベース**です。これについて詳しく書いていきます。

### 1.SQLとNoSQLについて

そもそも**SQL**とは何か。**SQL**とは、**Structured English Query Language**の略で、**RDB(Relational Database：リレーショナルデータベース)**を操作するための言語のことです。

**RDB**はデータを複数の表として管理し、表と表の間の関係を定義することで、複雑なデータの関連性を扱えるようにしています。

![4.jpg](https://qiita-image-store.s3.amazonaws.com/0/295037/7280a65d-45d8-597c-cd35-9c8a0e026e40.jpeg)


上記のような、表形式でまとめられた**RDB**を操作するための言語がSQLですが、この世の中には、全てのデータが表形式で保存することができるとは限りません。

表にしやすいデータであれば、**RDB**で効率良くデータを管理することができるのですが、表にしにくいデータも存在するわけで、

それらのデータを効率良く扱えるようにしようということで、**NoSQLデータベース**というものが出てきました。

**NoSQL**とは**Not only SQL**の略で、**NoSQLデータベース**とは非リレーショナルデータベースのことであり、**RDB**が持つ制限を緩和したものです。

この**NoSQL**のデータのモデルには大別して、

* キー・バリュー型
* カラム指向型
* グラフ型
* ドキュメント指向型

の4つの種類があり、**Firestore**は**ドキュメンと指向型**のデータベースです。次にこのドキュメント指向型のデータベースについて詳しく書いていきます。



### 2.ドキュメント指向データベースとは

ドキュメント指向データベースとは、自由な形式のデータを保存することができるデータベースです。SQLデータベースと違って、テーブルや行はなく、代わりにデータは「ドキュメント」に格納され、それが「コレクション」にまとめられます。

イメージとしては、以下の図のように、「フォルダ」があって、その中に複数の「ファイル」があって、それぞれのファイルに、自由な形式で「データ」が保存されているようなイメージです。

**Firebase**で使われている、ドキュメント指向データベースでは、この「フォルダ」に値するものを「コレクション」、ファイルに値するものを「ドキュメント」ファイルに書かれたものに値するものを「データ」と言います。

少し違う点としては、「フォルダ」の中には「フォルダ」を入れる事ができ、ファイルにはデータを書き込む事しかできませんが、

「コレクション」の中にはコレクションを持つことができず、また、ドキュメントは、データだけでなく、「コレクション」を持つことができます。

フォルダのイメージと、階層構造の作り方は少し違います。

![5.jpg](https://qiita-image-store.s3.amazonaws.com/0/295037/56c2aa57-8a5d-4ab7-ab21-be51c5f03aff.jpeg)

### 3.ドキュメント型データベースとRDB(リレーショナルデータベース)の比較

違いは調べているとたくさん出てくるのですが、メインの違いだけ説明します。ドキュメント指向のデータベースでは、柔軟なデータ構造を扱えるのに対し、RDBはデータベースの要素が厳密に定義されているので、非構造化のデータを管理することが苦手です。

|              |    ドキュメント型データベース    |               RDB(リレーショナルデータベース)                |
| :----------: | :------------------------------: | :----------------------------------------------------------: |
| データモデル | 柔軟。自由なデータ構造を扱える。 | テーブル、行、列、インデックス、テーブル間の関係などのデータベースの要素が厳密に定義されている。非構造化データが苦手。 |

## 最後に

**Firebase**というサービスで提供されているデータベース**Firestore**について説明しました。

**Firestore**を使いこなす事ができるようになると、開発できるアプリの種類が一気に広がるので、iOSアプリエンジニアを目指す人にとっては、勉強必須の機能かと思います。

もし何か、不明点等あれば、教えていただけると幸いです。

この**Firestore**を使って、簡単なToDoアプリを作ったので、それについて書いていこうかと思います。

また、以下は自分が運営している[「とがみんブログ」](https://togamin.com/)です。

* 時間、場所、お金に縛られない自由な生き方を目指した様々な経験

* 就職活動の中で、自己分析に嵌り、脳科学や心理学の本を読み漁りアウトプットしたもの
* 量子力学の考え方に基づいた、この世界の仕組み

と言った変な事を考えては、記事にして投稿しているので、よければこちらもブックマークお願いします(笑)。

[＞とがみんブログ](https://togamin.com/)



#### 参考文献

* [SQLって何？](https://qiita.com/nishiy-k/items/49b3b658fb90d3e8fed3)
* [RDB（Relational Database）とは | NoSQLとの違い・変化するデータベース事情](https://boxil.jp/mag/a3032/)
* [NoSQLについて勉強する。](https://qiita.com/t_nakayama0714/items/0ff7644666f0122cfba1)
* [ドキュメント型データベースとは](https://www.techcrowd.jp/nosql/documentdb/)