Firebaseのソリューション群の1つである「Firestore」。
ここではそのFirestoreについて特徴、コスト、そして保存方法などについて話していこうと思います。
Firestoreとは
Firestoreとは、そもそも
Firestoreのコスト
Firestoreは、主に以下2つの課金体系によって費用がかかります。
- 1. Firestoreに保存したデータの読み取り量
- 2. Firestoreに保存したデータ量
主に料金体系としては、
データ転送量(フロントサイドにデータを送る量)とデータ保存量によってお金がかかります。
上記2つが主な費用のかかる要素になりますが、これらについて説明していこうと思います。
1. データの読み取り量
Firestoreはデータベースなので、当然保存する、保存したデータを読み取る、削除する、更新するなどの処理が行われます。
SwiftからFirestoreへリクエストを投げて該当のデータを引っ張ってくることによるデータ量によって、
お金がかかります。
2. データ量
Firestoreに保存したデータ量が多くなると費用が多くかかります。
文字列や数値型だとそこまでデータ量が一気に増えることはありませんが、
画像であったり動画になると一気にデータ量が増えるため、どういったデータを保存するべきかを設計段階から考える必要があります。
画像や動画を保存してリアルタイムに更新したいなどがある場合は、
Firebaseの他のソリューションである「Firebase Storage」を使用することも考えるといいかと思います。
Firestoreの実装
ライブラリをまずXcodeプロジェクトに入れる必要があります。
ライブラリ管理ツールでcocoapodsを使用している場合は、
PodFileに、
pod 'Firebase/Firestore'
と記載して、
pod installして取り込みます。
そして、まだFirebase SDKを入れていない方は、
AppDelegate.swiftファイルに以下を記載します。
import Firebase
そして、didFinishLaunchingWithOptionsメソッドに、FirebaseApp.configure()を記載します。
import UIKit import Firebase @main class AppDelegate: UIResponder, UIApplicationDelegate { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. FirebaseApp.configure() return true } ... }
そして、Firestoreの実装です。
import FirebaseFirestore ... // ======= Firestore let db = Firestore.firestore() var ref: DocumentReference? = nil ref = db.collection("users").addDocument(data: [ "first": "Taro", "last": "Tanaka", "address": "東京", "born": "1815", "access_count": 3 ]) { err in if let err = err { print("Error adding document: \(err)") } else { print("Document added with ID: \(ref!.documentID)") } }
これで取り込みができます。
今Firestoreの管理画面上にはなにも保存していない状態です。この状態で実行してみます。
Xcode上のログに以下のようなエラーとなりました。
failed: Missing or insufficient permissions.
FirestoreなどFirebaseソリューション群には、セキュリティルールというアクセス制御(write, read)を設定する機能があります。
現時点で何もいじっていないので、今回このようなエラーで書き込みができなかったみたいです。
Firestoreを考える
Firestoreは上記の通り、データ転送量とデータ保存量によってお金がかかるので、いかにコストを下げるかを考える必要があります。
データ保存量は正直、保存するデータの項目を考えたら、アプリユーザーに比例してデータ保存量も多くなってしまいます。
そのため、自分たちでコントロールできるものとしては「データ転送量」になります。
データ転送量は、SQLで言えば全走査するのではなく、必要な分だけ参照するようにする必要があります。ただFirestoreはSQLのwhereのように
フィルタをかけて取得するようなことが結構難しかったりします。そのため、できる限りFirestoreのdocumentの構成を細分化して、
取得するデータを抑えるような仕組みを取るのがいいのでは?と思っています。(あくまで自分の意見なので、、、間違ってたらすみません)
さらには、Firestoreには画像なども入れることができますが、画像を入れた場合データ量は膨大になります。
さらにアプリでプロフィール画像などをとってくるような処理をすると、データ転送量も膨大になってしまいます。なので、GCPのGCSを使って、
GCSにコンテンツを入れて、FirestoreにはURLをテキストで保存するような仕組みをすることで、データ転送量を減らすなども考えるのもありかもしれません。
Firestoreに比べGCSは安いので。
Firestoreは、根本にWebSocketが基盤として作られていて、
なのでリアルタイムに、そして軽量のプロトコルで通信が可能で、データが更新されると自動的に他のユーザーにも通知が行きます。
Firestoreにおくべきデータ、価格を抑えるために様々なツールやサービスを使って、
データ構造を考える必要があるのが、アプリ開発の特徴かもしれません。
サブコレクション、全件検索の話などは盛り込ませてもいいのかもね!