Firestoreの実践的知見を得られる『Firestore Mastery』を読んだ

2019.08.21

Firebaseを使ってウェブサービス開発のお手伝いをする機会があった。その際に特に迷ったのが「NoSQLなFirestoreをどう使っていくか?」という点だ。データのモデリングや、データの読み書き権限を定義するセキュリティルール、クライアントとサーバー(Cloud Functions)のどちらでデータの書き込みをするのか等、考えることが非常に多い。 また、Firebaseは盛り上がっているがネット上にある記事には導入部分のものがほとんどで運用を意識したものや踏み込んだ解説のあるものは少ない。1

そこで今回読んだのがコミックマーケットで頒布された『Firestore Mastery』という同人誌だ。 Firebaseの中でも重要で難しいとされるFirestoreに絞って解説がされており、効果的にFirestoreを活用していく方法について書かれている。

thumbnail

対象読者は次のように書かれている。

Firebaseのチュートリアルをクリアし、ステップアップを目指している方 Firestoreの効果的な利用方法を学びたい方 業務レベルでFirestoreの利用を検討されている方(まえがきより)

チュートリアルレベルの内容は省かれており、過去にサーバーサイドでSQLを用いたプロダクト開発、JavaScriptがある程度読めることが前提になっているので、Firestore未経験の方にはマッチしないかもしれない。 ただ、一度でもFirestoreを触って、実務への導入に悩んでいる方にはピッタリの本だと思う。 商業誌にするには難易度が高く「これぞ同人誌!」いった内容だった。

目次

Firestoreの基礎

ドキュメントやコレクション、サブコレクション、リファレンスといった概念を公式ドキュメントよりわかりやすい説明がある。その後は利用ケースごとにサンプルコードが記載されており、どちらとも「Firestoreを始める時に欲しい」と思う内容だった。 Webでのオフライン対応や、Cloud Functionsで作成されるドキュメントを監視する手法など知らないことも多く、Firestoreを使ったことのある人でも一度確認した方がいい内容だと感じた。

セキュリティルール

Firestoreで一番難しいのが、データの読み書き権限やバリデーションを定義するセキュリティルールだと思っている。公式ドキュメントや「Firebaseを使ってみた」系の記事を見ても薄いルールが多く実際にどういう定義をするのかが分からないと感じていた。 だが本章ではセキュリティルールを形作るユーザ認証、スキーマ検証、データバリデーションをそれぞれパターンごとに解説している。ユーザ認証だけでもユーザID、IDトークン、カスタムクレームのパターンについて解説しており、現時点でこれより詳しい日本語文献はないと思うほどの内容だった。

データモデリング

NoSQL、中でもドキュメント志向なFirestoreでのデータモデリングについての章では、基本的な考え方を抑えた上で1:1、1:nといったRDBでいうリレーションの例を出してデータモデリングを説明している。 データのリレーションだけでなく、正規化・非正規化、マップ/リスト・サブコレクションといった「どっちを使えばいいのか分かりづらい」系のトピックにも踏み込んでくれており、手元においておく本として非常に心強い。

ショッピングサイトの実装

実際のサービスを作る際にどういった考え方で実装するのか?という話を「RDBが得意としているECサイト」という題材でまとめてくれている。約20ページに渡って、実際の設計とその理由を説明してくれており非常に参考になる。今までの総まとめ的な内容にもなっていた。

まとめ

Firestoreには日本語のドキュメントも用意されているがここまで踏み込んで書かれた日本語文献は他にないと思う。 Firestoreのチュートリアルを行って、実務に導入するまでには大きな隔たりがあると感じていたが、この本がその溝を埋めてくれると思うので、Firestoreを検討している方は読むとよさそう。

最後にもう一度『Firestore Mastery』のBOOTHリンクをおいておく。

Firestore Mastery - shiodaifuku - BOOTH

感想

BOOTHで見たとき電子版がないため購入を躊躇していたが買ってよかったと思う。結果的に価格以上の価値を感じた。 「Firestoreは簡単なデータ構造のアプリだけなのでは?」と感じていたがそんなことはなく、Firestoreの可能性を感じさせてくれた。 テクニックだけでも「ドキュメント変更の検知を行ってCloud Functionsでのデータを受け取る」・「ChangeLogをサブコレクションで持つ」など目から鱗なトピックがたくさんあった。 今まで書いたコードでも直したい箇所が出てきたので、少しずつ直していこうと思う。

注釈

  1. あるにはあるが断片的で、全体像を掴むのは難しいと感じている。