Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
学ぶ マルチテナンシーパターン | セクション
データベース設計パターン

bookマルチテナンシーパターン

メニューを表示するにはスワイプしてください

マルチテナンシーは、現代のデータベース設計において重要な概念であり、特に複数のクライアントや組織(テナント)に単一のプラットフォームからサービスを提供するアプリケーションで不可欠です。マルチテナントシステムでは、各テナントのデータが分離され、安全かつ効率的にアクセスできるようにデータベースを設計します。マルチテナンシーを実装する一般的なアプローチは、共有型、分離型、ハイブリッド型の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. マルチテナントデータベースにおける主要なセキュリティ上の考慮点は何ですか?

question mark

データベース設計におけるマルチテナンシーとは何ですか?

正しい答えを選んでください

question mark

共有型マルチテナントテーブルは分離型テーブルとどのように異なりますか?

正しい答えを選んでください

question mark

マルチテナントデータベースにおける主要なセキュリティ上の考慮点は何ですか?

正しい答えを選んでください

すべて明確でしたか?

どのように改善できますか?

フィードバックありがとうございます!

セクション 1.  17

AIに質問する

expand

AIに質問する

ChatGPT

何でも質問するか、提案された質問の1つを試してチャットを始めてください

セクション 1.  17
some-alt