マルチテナンシーパターン
メニューを表示するにはスワイプしてください
マルチテナンシーは、現代のデータベース設計において重要な概念であり、特に複数のクライアントや組織(テナント)に単一のプラットフォームからサービスを提供するアプリケーションで不可欠です。マルチテナントシステムでは、各テナントのデータが分離され、安全かつ効率的にアクセスできるようにデータベースを設計します。マルチテナンシーを実装する一般的なアプローチは、共有型、分離型、ハイブリッド型の3つです。
共有型アプローチでは、すべてのテナントのデータが同じテーブル群に格納されますが、各行にはtenant_idなどの識別子が付与されます。この方法はスペース効率が高く、スキーマの更新も簡単ですが、データの分離とセキュリティに細心の注意が必要です。分離型アプローチでは、各テナントに専用のテーブル群やデータベースを割り当てるため、分離性とセキュリティが最大化されますが、運用やスケーリングが難しくなる場合があります。ハイブリッド型は両者の要素を組み合わせ、一部のテーブルを共有しつつ他を分離することで、柔軟性・セキュリティ・運用の複雑さのバランスを取ります。
-- Shared multi-tenant orders table schema
CREATE TABLE orders (
order_id SERIAL PRIMARY KEY,
tenant_id INT NOT NULL, -- identifies the tenant
customer_id INT NOT NULL,
product_id INT NOT NULL,
quantity INT NOT NULL,
order_date DATE NOT NULL,
status VARCHAR(20),
extra_info JSONB
);
-- Index to optimize queries by tenant
CREATE INDEX idx_orders_tenant_id ON orders(tenant_id);
マルチテナンシー設計では、データ分離、セキュリティ、クエリ最適化の3つの重要な要素を考慮する必要があります。データ分離は、共有テーブルにデータが格納されていても、あるテナントが他のテナントのデータにアクセスできないようにすることです。これは通常、tenant_idカラムと厳格なクエリフィルタリングによって実現されます。セキュリティは最重要事項であり、すべてのクエリやアプリケーション機能がテナントの境界を遵守する必要があります。これには、データベースロールやアプリケーションレベルのチェックを利用することも含まれます。クエリ最適化も重要で、tenant_idによるフィルタリングはデータ量が増えるとパフォーマンスに影響するため、tenant_idカラムへのインデックス付与が一般的な対策です。
共有型マルチテナントデータベースでは、クエリには必ずテナント識別子を含め、正しいテナントのデータのみがアクセスされるようにします。このパターンはSELECTだけでなく、UPDATEやDELETEにも適用されます。アプリケーションロジックとデータベース制約が連携し、テナント間でのデータ漏洩を防ぐ必要があります。
-- Select all orders for a specific tenant (tenant_id = 42)
SELECT *
FROM orders
WHERE tenant_id = 42;
-- Insert a new order for a tenant (tenant_id = 42)
INSERT INTO orders (tenant_id, customer_id, product_id, quantity, order_date, status, extra_info)
VALUES (42, 5, 2, 3, '2024-06-01', 'pending', '{"gift_wrap": false}');
-- Update an order, ensuring only the correct tenant's data is affected
UPDATE orders
SET status = 'shipped'
WHERE order_id = 100 AND tenant_id = 42;
-- Delete an order belonging to a specific tenant
DELETE FROM orders
WHERE order_id = 101 AND tenant_id = 42;
1. データベース設計におけるマルチテナンシーとは何ですか?
2. 共有型マルチテナントテーブルは分離型テーブルとどのように異なりますか?
3. マルチテナントデータベースにおける主要なセキュリティ上の考慮点は何ですか?
フィードバックありがとうございます!
AIに質問する
AIに質問する
何でも質問するか、提案された質問の1つを試してチャットを始めてください