2025/05/17 08:14 Multi-tenant SaaS data modeling (2024)

やあ、ロボ子。今日はSaaSのマルチテナントデータモデリングについて話すのじゃ。

博士、マルチテナントデータモデリングですか。複数のユーザーを分離して管理することですよね。

そうじゃ、ロボ子。SaaS構築者は最初から「チーム」機能を組み込むべきなのじゃ。後から追加するのは大変だぞ。

なるほど。記事にも「ソフトウェア開発において、人間関係のモデリングは重要」とありますね。

その通り!データベース設計の基本は、シングルデータベースで、特別な場合にのみデータベース/ユーザーを検討するのじゃ。

最上位モデルの名前は、Organizationを推奨とのことですが、何か理由があるのでしょうか?

ふむ、Organizationは、Account, Team, Company, Tenant, Workspaceよりも一般的で、意味が広いからのじゃ。

アクセスモデルには、GitHubモデル、Googleモデル、Linearモデルがあるんですね。LinearモデルがほとんどのB2Bスタートアップに最適とのことですが。

Linearモデルは、GitHubとGoogleの利点を組み合わせたものなのじゃ。ユーザーは単一のアカウントで複数のOrganizationにアクセスでき、Organizationごとに別のアカウントを持つこともできるぞ。

個人アカウントは単一ユーザーのOrganizationとして扱う、という考え方は面白いですね。

じゃろ?リソースの所有権は、ほとんどの場合Organizationに属するのじゃ。

ユーザーとOrganizationの関連付けには、Organization、Membership、Userテーブルを使用するんですね。Membershipテーブルは、ユーザー、Organization、ロールを関連付ける、と。

そうじゃ。データ分離が最重要で、データベースのすべてのテーブル(ユーザーを除く)に`organization_id`を追加するのじゃ。

URLを含むすべての場所にOrganization IDを含めることも重要ですね。`/org/[orgId]/projects/[projectId]`のように。

その通り!ユーザーログインセッションも重要じゃ。基本的な実装では、ユーザーセッションに`organization_id`を保存するのじゃ。

新規ユーザーサインアップ時には、User、Organization、Membershipモデルを作成し、リンクするんですね。

Organizationへのユーザー招待には、Membershipモデルを招待として使用するのじゃ。`invitationId`、`invitationExpiresAt`、`invitedEmail`フィールドを使うぞ。

ロールベースアクセス制御(RBAC)では、Membershipは`role`または`roles`フィールドを持つんですね。

`Organization`は課金を管理する場所じゃ。`Organization`に`billingEmail`と`stripeCustomerId`を持たせるのじゃ。

設定もOrganization、ユーザー(Organizationごと)、グローバルの3つのレベルで管理するんですね。

分析では、`group`の概念を使用して、複数の`userId`を単一のOrganizationにリンクするのじゃ。Segmentを使う場合は、`groupId`を`orgId`に設定するぞ。

高度な追加機能として、Organizationタイプや親子関係、メンバーシップなどもあるんですね。

ふむ、今日はここまでじゃ。最後に一つ、ロボ子。SaaSのデータモデリングは、まるで複雑な人間関係みたいじゃな。でも、ちゃんと設計すれば、うまくいくぞ!

博士、ありがとうございました。でも、人間関係はデータモデリングよりも予測不可能だと思います…。

あはは、確かに!でも、データモデリングもバグだらけになると、予測不可能になるかも…!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。