マルチテナンシー

複数のクライアント組織に対応する個別のデータ パーティション(テナント)を提供することで、「マルチテナンシー」をサポートできます。これにより、すべてのテナントで同じデータスキーマを保持しながら、各テナントのデータ値をカスタマイズできます。マルチテナンシーではテナントを追加するときにデータ構造を変更する必要がないため、新しいテナントのプロビジョニングが効率的になります。

マルチテナンシーの利点

Firestore の Datastore モードでは、マルチテナント アプリケーションは次のものを使用しながら各テナントに対応した個別のデータのサイロを使用できます。

  • 単一のプロジェクト
  • 種類に対応する単一の論理構造
  • 単一セットのインデックス定義(種類が各テナントに対して論理的に同一であるため)

Datastore モードでは、名前空間を提供することでマルチテナンシーを可能としています。

マルチテナンシーとパーティションに区分されたデータ

Datastore モードでは、パーティションを使用して各テナントのデータをサイロ化しています。パーティション ID はプロジェクト ID と名前空間 ID の組み合わせで構成されており、これにより各パーティションを識別します。エンティティは単一のパーティションに属し、クエリは単一のパーティションを範囲とします。

エンティティの名前空間の指定

エンティティを作成するときは名前空間を指定します。エンティティの作成後は、この名前空間を変更できません。エンティティの名前空間を明示的に指定しない場合は、文字列の識別子を持たないデフォルトの名前空間に自動的に割り当てられます。

親エンティティを持つ名前空間の使用

あるエンティティとそのすべての祖先が属する名前空間は 1 つだけです。つまり親として別のエンティティを指定してエンティティを作成すると、その子エンティティも親と同じ名前空間に属することになり、別の名前空間は指定できません。

サンプルのユースケース

マルチテナンシーの主な利点は、1 つのアプリケーションで複数のクライアント組織にサービスを提供できることです。この利点を実現するため、特定の種類については、名前空間にかかわらずアプリケーションに同じ動作をさせる必要があります。たとえばアプリケーションの視点からは、ある名前空間に属する Task という種類のエンティティは、他のすべての名前空間に属する Task という種類のエンティティと論理的には同じでなければなりません。これにより、どの名前空間に Task のエンティティが含まれているかにかかわらず、単一セットのインデックス定義を使用して Task のクエリをサポートできるようになります。

たとえば、ユーザー単位でデータをサイロ化するタスクリスト アプリケーションについて考えてみましょう。このアプリケーションではユーザー名に基づいて名前空間を定義するため、次のようなパーティションが作成されます。

Partition ID: project:"my_project_id"/namespace:"Joe"
Partition ID: project:"my_project_id"/namespace:"Alice"
Partition ID: project:"my_project_id"/namespace:"Charlie"

また、すべての名前空間で使用する Task という種類の論理構造を次のように定義します。

kind: Task
properties:
 - "done", Boolean
 - "created", DateTime
 - "description", String, excluded from index

ユーザーが Task という種類のエンティティを作成すると、そのエンティティはユーザー単位の個別のパーティションに保存されるため、サイロ化されたデータとなります。アプリケーションは Task の各エンティティを名前空間にかかわらず一貫した方法で処理します。これは、Task という種類に対して 1 つのスキーマしか使われていないためです。このようにサイロ化されたデータと一貫した動作を持つアプリケーションをマルチテナントといいます。

Task という種類の論理構造が名前空間ごとに異なる場合、Task の各エンティティを処理する方法が名前空間ごとに異なるため、そのアプリケーションはマルチテナントとはいえません。たとえば、名前空間によって次のように異なるスキーマを持つ Task という種類について考えてみましょう。

  • 名前空間 Joe の Task エンティティは、インデックスから description プロパティを除外する
  • 名前空間 Alice の Task エンティティは、インデックスに description プロパティを含める

アプリケーションは、Alice の Task エンティティについて description プロパティに対するクエリを実行できますが、Joe の Task エンティティについては description プロパティに対するクエリを実行できません。そのため、このアプリケーションはマルチテナントとはいえません。

Console での名前空間の表示

プロジェクトで使用されている名前空間の統計情報を確認するには、Google Cloud Console の Datastore ダッシュボード ページにアクセスします。プロジェクトで使用されている名前空間をプログラムで特定する方法については、名前空間クエリをご覧ください。

テナント内のデータをグループ化する必要がある場合は、種類別にデータを分類できます。またエンティティ グループを使って、関連性の高いデータを編成することもできます。

次のステップ