Sql-Server

使用 Sql Server 的單數據庫和單模式方法的多租戶設計

  • March 27, 2017

您將如何設計應該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
)

方法一:

優點:

  1. 通過消除列,為來自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數據按列很好地分離SalesOrderSalesOrderItem

缺點:

為兩個表上的每條記錄浪費額外的 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,當然)。通過授予對這些視圖的訪問權並拒絕對實際表的訪問權,您將能夠提供與應用程序相同的安全性。

引用自:https://dba.stackexchange.com/questions/168215