Firestore コンソールを見つめながら「このデータをどこに置いたんだっけ?」や「なぜこのクエリが動かないの?」と疑問に思ったことがあるなら、あなただけではありません。Firestore は強力ですが、その NoSQL の性質はほとんどの開発者、特に SQL データベースから来た人々を困惑させます。正確になぜ混乱するのか、そしてそれについて何ができるかを分解しましょう。
なぜ Firestore はこんなに違うと感じるのか
MySQL、PostgreSQL、またはその他の SQL データベースを使用したことがあるなら、テーブル、行、結合で考えるように脳を訓練しています。Firestore はそのすべてを捨て去ります。テーブルはありません — コレクションだけです。行はありません — ドキュメントだけです。結合はありません — 非正規化されたデータだけです。そしてスキーマの強制もありません — 同じコレクション内のドキュメントは完全に異なるフィールドを持つことができます。
思考モデルの転換:
SQL
固定列を持つテーブル → 行は厳密なスキーマに従う → JOIN が関連データを結合 → 正規化が重複を避ける
Firestore
柔軟なドキュメントを持つコレクション → 各ドキュメントは異なることができる → JOIN はない — 代わりに非正規化 → 重複は期待され推奨される
すべての Firestore 初心者が犯す5つの間違い
1. すべてを正規化しようとする
SQL では、データの重複を避けるために正規化します。Firestore では、これは単一のビューを組み立てるために複数の読み取りを強制することになります。代わりに、読み取る場所にデータを保存してください — たとえユーザーの表示名を書いたすべてのコメントに重複させることになっても。
2. 関係に配列を使用する
ドキュメントにユーザー ID の配列を保存することは論理的に見えますが、Firestore の配列には深刻な制限があります:個々の要素を効率的にクエリできず、数千のアイテムを超えてスケールしません。代わりに、サブコレクションまたは参照を持つ別のコレクションを使用してください。
3. すべてを1つのドキュメントに入れる
Firestore はドキュメント読み取りごとに課金するため、すべてを1つの大きなドキュメントに詰め込みたくなります。しかし、ドキュメントには1MBの制限があり、2つのフィールドのみが必要な場合に500KBのドキュメントを読み取ると帯域幅を無駄にし、コストが増加します。焦点を絞った小さなドキュメントに分割してください。
4. クエリの制限を最初から無視する
Firestore は単一のクエリで複数のフィールドに対する不等式フィルタを実行できず、ネイティブの全文検索もできず、複合クエリにはインデックスが必要です。最初からクエリを中心にデータモデルを設計してください — 逆ではありません。
5. 構造をドキュメント化しない
スキーマがなければ、Firestore データベースはブラックボックスになります。新しいチームメンバーはフィールド名を推測し、タイプミスがサイレントバグを引き起こし、フィールドが必須かオプションかを誰も知りません。これは最も一般的で最も有害な間違いです。
Firestore データベースに構造をもたらす方法
良いニュース:柔軟性を放棄することなく Firestore に構造を追加できます。実践的な3つのステップがあります:
1クエリを最初に設計する
コレクションを作成する前に、アプリのすべての画面とそれが必要とするデータをリストアップしてください。このクエリファーストのアプローチは、データモデルが UI に役立つことを保証します — テーブルを最初に設計する SQL の考え方とは逆です。
2一貫したフィールド名と型を使用する
早期に規約を決定してください:camelCase または snake_case?タイムスタンプは Firestore Timestamp または ISO 文字列?必須フィールド対オプションフィールド?これらの決定をチームが見つけられる場所に書き留めてください。
3JSON Schema でコレクションをドキュメント化する
JSON Schema は、各コレクションの構造を記述できるオープンスタンダードです:フィールド名、型、どれが必須か、どの値が有効か。これはデータベースの設計図のようなものです — そしてリポジトリに保持すれば、正確なままのドキュメントとして機能します。
実際にはこのように見える
Firestore users コレクションを記述する簡単な JSON Schema です。すべてのフィールドに型と説明がある方法に注目してください — チームの誰でも一目でデータモデルを理解できます:
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"collection": "users",
"description": "Registered app users",
"schema": {
"type": "object",
"properties": {
"displayName": {
"type": "string",
"description": "User's full name"
},
"email": {
"type": "string",
"format": "email",
"description": "Login email address"
},
"role": {
"type": "string",
"enum": ["admin", "editor", "viewer"],
"description": "Access control role"
},
"createdAt": {
"type": "string",
"format": "date-time",
"description": "Account creation timestamp"
}
},
"required": ["displayName", "email", "role", "createdAt"]
}
}このスキーマファイルはリポジトリに存在し、PR でレビューされ、users コレクションの唯一の信頼できる情報源として機能します。もう推測する必要はありません。
スキーマをインタラクティブなドキュメントに変換する
コレクションのスキーマファイルができたら、FireSchema のようなツールがそれらをインタラクティブで閲覧可能なドキュメントとしてレンダリングできます — Swagger UI が REST API で機能するのと同様ですが、NoSQL データベース向けに設計されています。無料でオープンソースで、セットアップに約5分かかります。
次のステップ
Firestore の知識を構築し続けましょう: