Querier

Firestoreの設計ガイド | リレーションを活用した最適なデータモデルの設計方法

2023.07.10に公開 | 2023.07.10に更新

Querier運営

@querier_io@querierinc

「Querier(クエリア)」は社内向け管理画面を圧倒的な速さで、かつビジネスのスケールに合わせて柔軟に構築することができるローコードツールです。

管理画面の構築もWeb上で完結
エンジニアのためのローコードツール

Querierについて詳しく見る

Firestoreは、スケーラビリティとリアルタイム性を備えたクラウドベースのデータベースです。

データモデルの設計は、Firestoreの効果的な利用において重要な要素です。

本記事では、Firestoreの設計ガイドとして、リレーションを活用した最適なデータモデルの設計方法について詳しく解説します。

コレクションとドキュメントの設計

Firestoreでは、データはコレクションとドキュメントの階層構造で管理されます。

コレクションはドキュメントのグループであり、ドキュメントはキーと値のペアで構成されます。

データモデルを設計する際には、コレクションとドキュメントの階層構造を適切に活用することが重要です。

例えば、SNSアプリケーションを考えてみましょう。ユーザーの情報を管理するために、usersという名前のコレクションを作成します。

各ユーザーは一意のIDを持ち、そのIDをドキュメントのキーとして使用します。ユーザーの情報(名前、メールアドレス、プロフィール画像など)はドキュメントの値として格納されます。

Collection: users
   |
   ---- Document: user1
   |        |
   |        ---- name: "John"
   |        |
   |        ---- email: "john@example.com"
   |        |
   |        ---- profileImage: "https://example.com/profiles/user1.jpg"
   |
   ---- Document: user2
            |
            ---- name: "Emily"
            |
            ---- email: "emily@example.com"
            |
            ---- profileImage: "https://example.com/profiles/user2.jpg"

リレーションの設計

リレーションを活用することで、関連するデータを効率的に取得できます。

Firestoreでは、リレーションを実現するために2つの方法があります。

埋め込みドキュメント

埋め込みドキュメントは、ドキュメント内に他のドキュメントを埋め込む方法です。

例えば、SNSアプリケーションでは、ユーザーのドキュメント内にそのユーザーの投稿を埋め込むことができます。

埋め込みドキュメントを活用することで、一度の読み込みで関連するデータを取得できますが、ドキュメントのサイズが大きくなる可能性があるため、注意が必要です。

Collection: users
   |
   ---- Document: user1
   |        |
   |        ---- name: "John"
   |        |
   |        ---- email: "john@example.com"
   |        |
   |        ---- profileImage: "https://example.com/profiles/user1.jpg"
   |        |
   |        ---- Collection: posts
   |                 |
   |                 ---- Document: post1
   |                 |        |
   |                 |        ---- title: "Hello, Firestore!"
   |                 |        |
   |                 |        ---- content: "This is my first post."
   |                 |
   |                 ---- Document: post2
   |                          |
   |                          ---- title: "Firestore Tips"
   |                          |
   |                          ---- content: "Here are some useful tips for Firestore."
   |
   ---- Document: user2
            |
            ---- name: "Emily"
            |
            ---- email: "emily@example.com"
            |
            ---- profileImage: "https://example.com/profiles/user2.jpg"
            |
            ---- Collection: posts
                     |
                     ---- Document: post3
                              |
                              ---- title: "Firestore Security Rules"
                              |
                              ---- content: "Learn how to secure your Firestore data."

メリット

  • ドキュメント内に関連するデータを埋め込むことができます。関連するデータの取得に1度の読み込みで済むため、読み込みの効率が良くなります。
  • ドキュメント内のデータをトランザクション単位で一貫性を持たせることができます。

デメリット

  • 埋め込まれたドキュメントが大きくなると、そのドキュメントのサイズが大きくなる可能性があります。これにより、読み込みや更新操作が遅くなる可能性があります。
  • 埋め込まれたドキュメントの更新が頻繁に行われる場合、コストが高くなる可能性があります。

利用シーン

  • データが頻繁に変更されず、一緒に読み込まれることが多い場合に適しています。
  • 1つのドキュメント内に関連するデータが完全に含まれる場合、参照フィールドよりもシンプルな設計となります。

参照フィールド

参照フィールドを使用することで、異なるコレクション間の関連データを参照することができます。

例えば、SNSアプリケーションでは、ユーザーのドキュメント内に投稿の参照を持たせることができます。

参照フィールドを活用することで、ドキュメントのサイズを小さく保つことができますが、関連するデータを取得するために追加の読み込みが必要となるため、クエリの効率化が求められます。

Collection: users
   |
   ---- Document: user1
   |        |
   |        ---- name: "John"
   |        |
   |        ---- email: "john@example.com"
   |        |
   |        ---- profileImage: "https://example.com/profiles/user1.jpg"
   |        |
   |        ---- Refs: [post1, post2]
   |
   ---- Document: user2
            |
            ---- name: "Emily"
            |
            ---- email: "emily@example.com"
            |
            ---- profileImage: "https://example.com/profiles/user2.jpg"
            |
            ---- Refs: [post3]

メリット

  • 異なるコレクション間の関連データを参照することができます。関連データを取得するための追加の読み込みが必要ですが、ドキュメントのサイズを小さく保つことができます。
  • 参照フィールドを使用することで、データの正規化が可能となります。複数のドキュメントで共有されるデータを一元管理することができます。

デメリット

  • 関連データを取得するために追加の読み込みが必要となるため、読み込みの効率がやや低下します。
  • トランザクションの範囲が異なるコレクションにまたがる場合、一貫性を保つことが困難になる場合があります。

利用シーン

  • 関連データの読み込みが頻繁に行われる場合や、データの正規化が必要な場合に適しています。
  • 関連データの更新がドキュメント内の他のデータに影響を与える可能性がある場合には、参照フィールドを使用することで、データの整合性を保つことができます。

インデックスの設計

Firestoreでは、クエリのパフォーマンンスを向上させるためにインデックスを設計する必要があります。

インデックスを適切に設計することで、クエリの実行時間を短縮し、コストを削減することができます。

例えば、ユーザーの名前を使用してユーザーを検索するクエリを考えてみましょう。

名前に基づいてユーザーを検索するためには、名前フィールドにインデックスを作成する必要があります。これにより、効率的な検索が可能となります。

firestore.collection("users").where("name", "==", "John");

さいごに

Firestoreのデータモデルの設計は、データベースのパフォーマンスに直結する重要な要素です。

本記事では、Firestoreの設計ガイドとして、リレーションを活用した最適なデータモデルの設計方法について解説しました。

正しい設計を行うことで、Firestoreの効果的な利用が可能となります。是非、これらのガイドラインを参考にして、Firestoreの設計に取り組んでみてください。

参考文献

「Querier(クエリア)」は社内向け管理画面を圧倒的な速さで、かつビジネスのスケールに合わせて柔軟に構築することができるローコードツールです。

最新の記事

【告知】値の参照時の仕様変更のお知らせ

このたび2024年11月11日に値の参照に関する仕様変更を予定しておりますので詳細について報告いたします。

more

管理画面の構築もWeb上で完結
エンジニアのためのローコードツール

Querierについて詳しく見る