实现Multi-Tenant Architecture:Claude Code 实战指南
了解implementing multi-tenant architecture:Claude Code 实战. 包含实用代码示例。
マルチテナント设计を通过 Claude Code 实现
SaaS应用ではマルチテナント设计が不可或缺。テナント間の数据分離、テナント固有の配置管理、アクセス制御をどう実現するかが重要な设计判断となります。借助 Claude Code,合适的マルチテナントパターンを一貫性のあるコードで实现可以。
テナント分離パターンの选择
主なアプローチは3つあります。
- 行レベル分離: 全テナントが同じ表格を共有し、
tenantIdカラムでフィルタリング - Schema分離: テナントごとに別のDBSchemaを使用
- DB分離: テナントごとに独立した数据库
让 Claude Code设计判断を相談することも可以。
> SaaS应用のマルチテナント设计关于相談したい。
> 想定テナント数は1000程度、每个テナントの数据量は中程度。
> 行レベル分離で实现して、テナントID通过フィルタリングを
> 中间件で自动化して。
テナント解決中间件
// src/middleware/tenant.ts
import { NextRequest, NextResponse } from 'next/server';
import { prisma } from '@/lib/prisma';
export async function resolveTenant(request: NextRequest) {
// サブドメインからテナントを解決
const hostname = request.headers.get('host') || '';
const subdomain = hostname.split('.')[0];
// カスタムドメイン的情况下
const tenant = await prisma.tenant.findFirst({
where: {
OR: [
{ subdomain },
{ customDomain: hostname },
],
isActive: true,
},
});
if (!tenant) {
return NextResponse.json({ error: 'テナントが見つかりません' }, { status: 404 });
}
// 请求头部にテナントIDを注入
const headers = new Headers(request.headers);
headers.set('x-tenant-id', tenant.id);
return NextResponse.next({ request: { headers } });
}
テナントスコープ付きPrisma客户端
// src/lib/tenant-prisma.ts
import { PrismaClient } from '@prisma/client';
export function createTenantPrisma(tenantId: string) {
const prisma = new PrismaClient().$extends({
query: {
$allModels: {
async findMany({ args, query }) {
args.where = { ...args.where, tenantId };
return query(args);
},
async findFirst({ args, query }) {
args.where = { ...args.where, tenantId };
return query(args);
},
async create({ args, query }) {
args.data = { ...args.data, tenantId };
return query(args);
},
async update({ args, query }) {
args.where = { ...args.where, tenantId };
return query(args);
},
async delete({ args, query }) {
args.where = { ...args.where, tenantId };
return query(args);
},
},
},
});
return prisma;
}
テナント配置の管理
// src/services/tenant-settings.ts
interface TenantSettings {
branding: {
primaryColor: string;
logo?: string;
companyName: string;
};
features: {
maxUsers: number;
storageLimit: number;
apiAccess: boolean;
};
notifications: {
emailEnabled: boolean;
slackWebhook?: string;
};
}
export class TenantSettingsService {
async getSettings(tenantId: string): Promise<TenantSettings> {
const tenant = await prisma.tenant.findUnique({
where: { id: tenantId },
select: { settings: true, plan: true },
});
// プラン基于デフォルト配置とカスタム配置をマージ
const planDefaults = getPlanDefaults(tenant!.plan);
return { ...planDefaults, ...tenant!.settings } as TenantSettings;
}
async updateSettings(tenantId: string, updates: Partial<TenantSettings>) {
return prisma.tenant.update({
where: { id: tenantId },
data: { settings: updates },
});
}
}
数据分離测试の重要性
マルチテナント实现では、テナント間の数据漏洩を防ぐ测试が非常に很重要。让 Claude Code「テナントAの数据がテナントBからアクセスできないことを确认する测试」を依頼して、十分な覆盖率を確保吧。
関連リソース
ロールベースのアクセス制御はRBAC实现指南、数据库设计は数据库迁移。
PostgreSQLの行レベル安全(RLS)相关内容请参阅PostgreSQL官方文档(postgresql.org/docs)。
免费 PDF:5 分钟看懂 Claude Code 速查表
只需留下邮箱,我们就会立即把这份 A4 一页速查表 PDF 发送给你。
我们会严格保护你的个人信息,绝不发送垃圾邮件。
把 Claude Code 变成真正能带来结果的工作流
先领取中文说明的免费 PDF,再进入英文商品页选择合适的教材。如果你需要团队落地、流程设计或内容变现支持,也可以直接咨询。
本文作者
Masa
深度使用 Claude Code 的工程师。运营 claudecode-lab.com——一个涵盖 10 种语言、超过 2,000 页内容的科技媒体。
相关文章
每天发布多语言 Claude Code 文章前,要先检查的 7 件事
一份实用清单,帮助你每天发布多语言 Claude Code 文章时避免漏语言、CTA 错位和线上内容未更新。
Codex Automations 是什么?让 AI 在你睡觉时完成内容运营
用 Codex Automations 自动查看流量、选择主题、写文章、改善转化路径并部署网站的实用指南。
Claude Code × GCP Cloud Functions 完全指南 | 极速开发无服务器函数
用 Claude Code 高效开发 GCP Cloud Functions。从 HTTP/Pub/Sub/Firestore 触发器实现到本地测试、部署自动化,基于 Masa 的实战经验,附完整可运行代码示例。