Firebaseの個人的ベストプラクティス

Firebaseを使えば、データベース、認証、ホスティング、分析などの機能を簡単に追加できます。

しかし、Firebaseのデータベース(Firestore)は、特有の「セキュリティルール」を用意する必要があったり、それ自体NoSQLであったりするためにそこまで普及していません。

そこで、この記事では、それでもこうやって使えばFirebaseは最高に便利だぞ、という個人的なベストプラクティスを紹介します。

データベース(Firestore)

※ 最近Firebaseに PostgreSQL が利用できるようになりましたので、その場合このFirestoreは関係ありません。 ※ さらに最近Firestoreは MongoDB 互換のAPIが利用できるようになりました。が、ここでは言及しません。

Firestoreの特徴

  • 最初から速い
  • データを管理画面UI上でCRUDできる
  • リアルタイムなデータ更新・表示がしやすい
  • NoSQL
  • APIサーバーがあるため、クライアントコード(SDK)でアクセスできる
  • クライアントコードでアクセスするならセキュリティルールが必須

Firestoreの厄介なところ

Firestoreの厄介なところは、NoSQLであり、さらにクライアントコードでアクセスするならセキュリティルールが必須であることです。

しかし、クライアントコードでアクセスできるのは非常に便利でコード量も減りますし、NoSQLだからといって特に難しいことはありません。

とはいえセキュリティルールは面倒です。なぜならFirestore独自のものであり、他のデータベースでは全く使わないものだからです。つまり学習が必要になります。

たとえば、users コレクションに対して自分だけがアクセスできるようにするには、以下のように書きます。

  match /users/{userId} {
    allow get, list: if request.auth.uid == userId; // = リクエストしてくるユーザーがuserId(FirestoreのドキュメントID)と一致している場合のみアクセスできる
  }

また、posts コレクションに対して誰でもアクセスできるようにするには、以下のように書きます。

  match /posts/{postId} {
    allow get, list: true; // = 常に誰でもアクセスできる
  }

一見シンプルですが、「あるデータを共有して複数ユーザーが閲覧できるようにしたい」といった場合など、少し複雑になるだけで頭を抱えるほど悩みます(だいたい詰みます)。

セキュリティルールのベストプラクティス

そこで以下のようにセキュリティルールを書いていくと非常にラクになります。

データ構造の設計はセキュリティルールありきで考える

ある程度セキュリティルールを書いて問題ないことを確認したうえでデータ構造を用意していってください。

そうしないと、あとになってセキュリティルールが書けないという問題が置きます。

たとえば、コレクションの中の一部のフィールドについてのみルールを適用したい場合がありますが、それは仕様上不可能です。

積極的にコレクションを作る

セキュリティルールは万能ではないし、想定外のデータを扱うことになります。

そこで、たとえばコレクションの中の一部のフィールドについてのみルールを適用したい場合がありますが、それは仕様上不可能。

なので、新たにコレクションを作成して、その中にデータを入れておくという方法があります。

たとえば、users コレクションに対して自分だけがアクセスできるようにするには、以下のように書きます。

  match /users/{userId} {
    allow get, list: if request.auth.uid == userId;
  }

一方で、user_profiles コレクションに対しては、誰でもアクセスできるようにするには、以下のように書きます。

  match /user_profiles/{userId} {
    allow get, list: true;
  }

同時に、user_settings コレクションに対しては、サーバー(Firebase Admin SDKなど)のみでアクセスできるようにするには、以下のように書きます。

  match /user_settings/{userId} {
    allow get, list: if false; // = 常にクライアントコードではアクセスできない
  }

このように、コレクションを新たに作成して、その中にデータを入れておくという方法があります。

セキュリティルールはコレクションごとに適用するものなので、このようにガンガンコレクションを作っていけばいいのです。

1つのコレクションの中に全てのユーザー情報を入れるのではなく、それぞれの種類の情報はそれぞれのコレクションに入れておくというのも一つの方法なのです。

FirestoreはNoSQLですから、そのあたりもしやすいのです。

${userId}_${postId} のようなドキュメントIDを使う

ドキュメントIDは、複数の関連ドキュメントIDを組み合わせて作成するというのも一つの方法です。

  const newDocumentId = `${userId}_${postId}`;

このように書けば、セキュリティルールを非常に適用しやすいためです。

たとえば、

id, created_at, updated_at を全てのドキュメントのフィールドに入れる

created_at, updated_at はFirestoreに限らずという感じで説明不要かと思いますが、 idについては実はFirestoreはuidという別情報があるので、さらにフィールドとしてidを追加するのは冗長になってしまうのですが、uidを使うのはあまりにも面倒なので、フィールドにも入れておきます。

uidだけで管理すると、管理画面やデータ取得時にドキュメントを見るときに、uidがわかりにくいのです。ドキュメントを取得したとき、idがあれば取得しやすいですしコードも見やすくなります。

ドキュメントIDは手動生成する

FirestoreにはドキュメントIDを自動生成させる方法( addDoc() )がありますが、それだと下記のようにIDとデータが別々になってしまいます。

const db = getFirestore(app);
 
// ドキュメント作成
const data = {
  title: "Hello world",
  content: "This is a test post",
};
const documentRef = await addDoc(collection(db, "posts"), data);
console.log("ドキュメントID: ", documentRef.id);
console.log("ドキュメントデータ: ", documentRef.data());

そこで、以下のようにドキュメントIDを手動で生成します。

const db = getFirestore(app);
 
// ドキュメント作成
const newDocumentId = crypto.randomUUID(); //たとえばUUIDを生成する
const data = {
  id: newDocumentId,
  title: "Hello world",
  content: "This is a test post",
};
await setDoc(doc(db, "posts", newDocumentId), data);
console.log("ドキュメントデータ: ", data);

Read more

リアルタイム投票アプリ5選【ライブ配信やイベントで】

リアルタイム投票アプリ5選【ライブ配信やイベントで】

ウェビナーやセミナー、社内研修を実施する際、「参加者が受け身になってしまう」「質問がなかなか出てこない」といった課題を感じたことはないでしょうか。 オンラインでの情報発信が当たり前になった今、一方的な配信だけでは参加者の満足度を高めることが難しくなっています。そこで注目されているのが、リアルタイムで参加者の意見を集約し、その場で結果を共有できる投票・質問ツールです。 本記事では、ライブ配信やイベント、研修などで活用できるリアルタイム投票アプリを5つ厳選してご紹介します。 リアルタイム投票でつながる参加者とイベント リアルタイム投票やQ&A機能を使うと、視聴者や参加者の意見を即座に集計・表示できます。講義や会議の進行を妨げず、参加者全員が自分の意見を簡単に表明できる仕組みです。 従来の挙手による質疑応答では、発言しづらいと感じる参加者も少なくありません。特にオンラインイベントでは、カメラがオンになっていることへの抵抗感や、大人数の前で質問することへのハードルが存在します。 しかし、スマートフォンから匿名で投票やコメントができる仕組みがあれば、参加者は気軽に自分の意見を伝えら

By 阿部 隼也
質問受付ツールの選び方とおすすめ5選を紹介

質問受付ツールの選び方とおすすめ5選を紹介

セミナーや講演会、社内研修などで「質問はありませんか?」と投げかけても、なかなか手が挙がらない経験はないでしょうか。参加者に有益な情報を提供しても、疑問や意見が共有されないまま終わってしまうのは、主催者にとっても参加者にとっても大きな機会損失です。 こうした課題を解決するために注目されているのが「質問受付ツール」です。参加者がスマートフォンから匿名で質問を投稿できるため、発言への抵抗感が下がり、活発なコミュニケーションが生まれます。 本記事では、質問受付ツールの基本機能から、実際に役立つおすすめツール5選、そして選定時に押さえておきたいポイントまで、実務に活かせる情報をまとめて解説します。 質問受付の現場課題 イベントやセミナーの運営で最も頭を悩ませる問題の一つが、参加者からの質問をいかに引き出すかという点です。質問タイムを設けても、会場がシーンと静まり返ってしまい、仕方なく「それでは時間になりましたので」と締めくくる光景は珍しくありません。 この背景には、日本特有の文化的要因も関係しています。大勢の前で発言することへの恥ずかしさ、自分の質問が的外れではないかという不安、他

By 阿部 隼也
オンラインセミナーアプリの選び方。参加者エンゲージメントを高めるポイント

オンラインセミナーアプリの選び方。参加者エンゲージメントを高めるポイント

近年、オンラインセミナーの活用が急速に広がっています。会場のコストや移動時間を気にすることなく、全国・世界中から参加者を集められる点は大きな魅力です。 しかし、せっかく開催しても 「参加者が途中で離脱してしまう」 「ただ見ているだけで反応が薄い」 といった課題を抱えている企業も少なくありません。 本記事では、参加者のエンゲージメントを高め、成果につながるオンラインセミナーアプリの選び方と、実務に役立つ具体的なポイントを解説します。 参加者とのつながりを生むオンライン環境の設計 オンラインセミナーにおける最大の課題は、画面越しの距離感です。会場で直接顔を合わせる機会がないからこそ、参加者が「ただ見ているだけ」にならないような仕組みが求められます。適切なツールと機能選びが、参加者のエンゲージメントを左右します。 従来のオフラインセミナーでは、会場の雰囲気や参加者同士の反応が自然と生まれましたが、オンラインではそうした「空気感」が伝わりにくくなります。だからこそ、双方向のコミュニケーション機能や、参加者の行動データを活用した設計が重要になるのです。 エンゲージメントを高

By 阿部 隼也
参加者の質問を効率的に管理!ZoomウェビナーQ&A機能の使い方を徹底解説

参加者の質問を効率的に管理!ZoomウェビナーQ&A機能の使い方を徹底解説

オンラインでのセミナーやイベントが日常化する中で、Zoomウェビナーを活用している企業が増えています。しかし、ウェビナーの開催で意外と頭を悩ませるのが「参加者からの質問をどう管理するか」という点ではないでしょうか。 セミナーが盛り上がり、次々と質問が寄せられるのは嬉しいことです。一方で、質問が多すぎて整理しきれない、どの質問に優先的に答えるべきか判断に迷う、といった課題も生じます。こうした問題を解決するために役立つのが、ZoomウェビナーのQ&A機能です。 本記事では、ZoomウェビナーのQ&A機能の基本的な使い方から、参加者の質問を効率的に管理する実践的なテクニックまで、詳しく解説していきます。 ZoomウェビナーのQ&A機能とは ZoomウェビナーのQ&A機能は、ウェビナー開催中に参加者が質問を投稿し、主催者側が回答を行うための専用機能です。この機能を使うことで、質問と回答がスレッド形式で整理され、効率的なコミュニケーションが可能になります。 チャット機能との違い Zoomには「チャット機能」もあるため、「Q&A機能とチャット機能の違いは何か」と疑問に思う方も多いで

By 阿部 隼也