Sql-Server
使用 Sql Server 的單數據庫和單模式方法的多租戶設計
您將如何設計應該
TenantId
在單個表中使用的數據隔離表?我想出了兩種方法,用我的一點經驗寫下利弊,但我想請教一下成功實施的意見。
- 租戶詳細資訊儲存在
Tenant
表中。- 客戶對每個租戶都是唯一的,並儲存在
Customer
表中。- 銷售抬頭和項目詳細資訊與
Customer
.常用表
CREATE TABLE Tenant( TenantId SMALLINT IDENTITY(1,1) NOT NULL, TenantName VARCHAR(32) NOT NULL ) CREATE TABLE Customer( CustomerId INT IDENTITY(1,1), TenantId SMALLINT NOT NULL, CustomerName VARCHAR(32) NOT NULL )
方法一:
優點:
- 通過消除列,為來自
SalesOrder
和表的每條記錄節省 2 個字節。SalesOrderItem``TenantId
缺點:
要查詢銷售訂單必須始終連接
Customer
表來辨識TenantId
。CREATE TABLE SalesOrder ( SalesOrderId INT IDENTITY(1,1), CustomerId INT NOT NULL ) CREATE TABLE SalesOrderItem ( SalesOrderItemId INT IDENTITY(1,1), SalesOrderId INT NOT NULL )
方法二:
優點:
TenantId
數據按列很好地分離SalesOrder
和SalesOrderItem
。缺點:
為兩個表上的每條記錄浪費額外的 2 個字節。
CREATE TABLE SalesOrder ( SalesOrderId INT IDENTITY(1,1), TenantId SMALLINT NOT NULL, CustomerId INT NOT NULL ) CREATE TABLE SalesOrderItem ( SalesOrderItemId INT IDENTITY(1,1), TenantId SMALLINT NOT NULL, SalesOrderId INT NOT NULL )
您可能會注意到每種方法的優缺點只是相反,但是我可能不是有經驗的人來詳細寫下每種方法的優缺點。如果有類似經驗的人可以突出顯示這裡完全缺少的一些東西,那就太好了。
我希望,隨著未來租戶的增加,基於 TenantId 創建分區並使用
Sql Server
.
我會選擇包含
Tenant_ID
在所有表格中。是的,這是非規範化的,但有充分的理由。在這種情況下,確保一個租戶無法看到另一個租戶的數據*至關重要。*如果每個查詢都包含
Tenant_ID
, 這有助於確保這一點。您對未來分區的註釋是另一個原因(儘管此時並不重要)。
我可以想到另一個。如果您的一個租戶需要某種對數據庫的直接 SQL 訪問,您可以為所有表創建視圖,使用
WHERE Tenant_ID = 12
(或任何適當的 ID,當然)。通過授予對這些視圖的訪問權並拒絕對實際表的訪問權,您將能夠提供與應用程序相同的安全性。