多租戶 SaaS 架構完整指南:從概念到技術實現

更新日期: 2025 年 3 月 20 日

本文為 SaaS 架構基礎,第 4 篇:

  1. 網站入門指南:認識站點(Site)的概念與應用
  2. 網站前台與後台:初學者指南
  3. 資料庫層級結構:Database、Schema、Table 的關係與應用
  4. 多租戶 SaaS 架構完整指南:從概念到技術實現 👈進度

隨著企業數位轉型的加速,越來越多企業選擇 SaaS(Software as a Service,軟體即服務) 作為 IT 解決方案。

與傳統軟體不同,SaaS 服務通常是雲端架構,企業只需透過網頁或 API 連接,即可使用軟體功能,不需要自行部署伺服器或安裝軟體。

然而,當 SaaS 平台需要服務多家企業(租戶,Tenant)時,系統架構就變得更加複雜。

這時候,多租戶(Multi-Tenant)架構成為了 SaaS 開發的重要模式,能夠讓不同企業共用同一套後端系統,但仍能保持數據隔離與 UI 客製化

本篇文章將詳細介紹多租戶 SaaS 架構的概念、優勢、技術實現方式,並解析如何透過 API 來控制不同企業的 UI 設定,讓初學者能夠理解並應用這種架構設計。


什麼是多租戶(Multi-Tenant)架構?

多租戶(Multi-Tenant) 指的是同一個 SaaS 平台可以同時服務多家企業(租戶),並且讓這些租戶共用相同的後端系統,但仍然能夠確保數據隔離、UI 風格客製化,以及不同的功能權限

舉例說明

假設有一個「雲端人資管理系統」,公司 A 和公司 B 都使用這個 SaaS 服務。

在多租戶架構下

公司 A 的 HR 員工登入後,看到的是 A 公司的 Logo、員工名單、考勤紀錄,但無法存取公司 B 的資料。
公司 B 的 HR 員工登入後,看到的是 B 公司的專屬 UI 風格、數據與功能,但同樣無法存取 A 公司的資訊。
這兩家公司使用相同的系統(同一個 SaaS 服務),但各自擁有獨立的資料與設定


傳統軟體模式 VS SaaS 模式

比較項目傳統軟體模式(On-Premise)SaaS 模式(Multi-Tenant SaaS)
安裝方式需要企業自行安裝、部署企業透過雲端登入使用
維護成本企業自行維護,需 IT 團隊由 SaaS 提供商維護,企業無需管理伺服器
升級更新需要企業手動升級由 SaaS 提供商統一升級
數據管理每個企業的系統獨立,無法共享多個企業共用系統,但數據隔離
成本企業需一次性支付軟體購買費企業按月/年支付訂閱費

SaaS 模式下,多租戶架構讓企業能夠快速擴展,並降低 IT 維護成本,這也是 SaaS 服務能夠迅速普及的關鍵之一。

flowchart TB
    subgraph "傳統軟體模式"
        A1([客戶 A]) --> B1([客戶 A 專屬服務<br>獨立部署])
        A2([客戶 B]) --> B2([客戶 B 專屬服務<br>獨立部署])
        A3([客戶 C]) --> B3([客戶 C 專屬服務<br>獨立部署])
        
        B1 --> C1[(客戶 A 專屬<br>資料庫)]
        B2 --> C2[(客戶 B 專屬<br>資料庫)]
        B3 --> C3[(客戶 C 專屬<br>資料庫)]
    end
    
    subgraph "SaaS 多租戶模式"
        D1([客戶 A]) --> E([統一 SaaS 服務<br>單一部署])
        D2([客戶 B]) --> E
        D3([客戶 C]) --> E
        
        E --> F1[(多租戶資料庫<br>共享架構)]
        
        subgraph "邏輯隔離"
            F1 --> G1[租戶 A 資料]
            F1 --> G2[租戶 B 資料]
            F1 --> G3[租戶 C 資料]
        end
    end

多租戶 SaaS 架構:資料隔離方式詳解

多租戶架構(Multi-Tenant Architecture) 中,最關鍵的問題之一是 「如何確保不同企業(租戶)的數據彼此隔離?」

因為所有租戶都共用同一套 SaaS 服務,如果數據隔離不當,可能會導致跨企業資料存取的風險,造成資訊洩漏或安全漏洞。

為了解決這個問題,開發團隊通常會選擇適當的資料庫設計模式,確保租戶之間的數據隔離程度符合業務需求。

以下是三種常見的資料隔離方式,從共享資料庫到完全獨立資料庫,各有其優勢與適用場景。

共享資料庫,共享 Schema(Shared Database, Shared Schema)

在這種模式下,所有租戶共用同一個資料庫,且所有表格也共享,但透過 tenant_id(租戶識別碼)來區分不同企業的數據。

📌 實作方式

  • 所有租戶的資料存放在相同的資料表中,例如:
employees
┌─────────────┬────────────┬───────────┐
 tenant_id    name        position  
├─────────────┼────────────┼───────────┤
 A            Alice       Manager   
 A            Bob         Engineer  
 B            Charlie     HR        
 B            David       Sales     
└─────────────┴────────────┴───────────┘
  • 每次查詢時,系統會根據 tenant_id 來篩選數據,確保每個企業只能存取自己的資料。
  • 例如,當 公司 A 的用戶登入,查詢 employees 表時,系統會執行:
SELECT * FROM employees WHERE tenant_id = 'A';

優勢

  • 開發與維護成本最低:所有租戶共用同一套 Schema,不需要為每個租戶建立新的資料表或資料庫。
  • 擴展性佳:當新租戶加入時,只需要新增一個 tenant_id,不需要變更資料庫架構。

缺點

  • 數據隔離程度較低:如果 SQL 查詢沒有適當地加上 tenant_id 條件,可能導致跨租戶資料存取的風險。
  • 報表與備份管理較複雜:需要額外的邏輯來區分不同租戶的數據,防止意外暴露他人資訊。

📌 適用場景

  • 小型 SaaS 平台,用戶數量較少,對數據隔離要求較低的系統。
  • 企業用戶之間不涉及高度敏感數據,例如簡單的 CMS(內容管理系統)或內部工具。

共享資料庫,獨立 Schema(Shared Database, Isolated Schema)

這種模式下,所有租戶仍然共用同一個資料庫,但每個租戶擁有獨立的 Schema(資料表結構),確保不同租戶的數據不會混在一起。

📌 實作方式

  • 每個租戶擁有自己的資料表,但存放在同一個資料庫中,例如:
companyA.employees
┌───────┬────────────┬───────────┐
│ id    │ name       │ position  │
├───────┼────────────┼───────────┤
1     │ Alice      │ Manager   │
2     │ Bob        │ Engineer  │
└───────┴────────────┴───────────┘

companyB.employees
┌───────┬────────────┬───────────┐
│ id    │ name       │ position  │
├───────┼────────────┼───────────┤
1     │ Charlie    │ HR        │
2     │ David      │ Sales     │
└───────┴────────────┴───────────┘
  • 查詢時,系統會根據租戶 ID 存取不同的 Schema
  • 例如,公司 A 登入後,系統會查詢 companyA.employees,而不是 companyB.employees

優勢

  • 數據隔離性更高:租戶之間的數據存放在不同的 Schema 中,即使 SQL 錯誤執行,也不會影響其他租戶的數據。
  • 可針對不同租戶進行個別優化:例如,公司 A 可能需要不同的索引策略,而公司 B 可能需要額外的欄位。

缺點

  • 管理較為複雜:當租戶數量增加時,需要動態管理 Schema,並確保所有租戶的表結構一致。
  • 資料庫查詢與維護成本較高:由於不同租戶的數據分布在不同 Schema,跨租戶的查詢變得更加困難。

📌 適用場景

  • 中型 SaaS 企業,需要一定程度的數據隔離,但又希望共用相同的基礎架構。
  • 例如 財務系統、企業級 CRM,不同租戶的數據較為敏感,需要更高的安全性。

獨立資料庫(Separate Database)

這種模式下,每個租戶擁有完全獨立的資料庫,確保最高的數據隔離性。

📌 實作方式

  • 每個租戶擁有獨立的資料庫,例如:
companyA_DB (獨立資料庫)
├── employees
├── payroll
├── attendance

companyB_DB (獨立資料庫)
├── employees
├── payroll
├── attendance
  • companyA_DB (獨立資料庫) ├── employees ├── payroll ├── attendance companyB_DB (獨立資料庫) ├── employees ├── payroll ├── attendance
  • 當用戶登入時,系統會根據租戶 ID 連接對應的資料庫,例如:
if tenant_id == "A":
    db.connect("companyA_DB")
elif tenant_id == "B":
    db.connect("companyB_DB")

優勢

  • 提供最高的數據隔離安全性,完全避免跨租戶數據存取問題。
  • 可針對不同租戶進行個別擴展與最佳化,例如某些大客戶可以擁有更強的伺服器資源。

缺點

  • 管理成本最高,每新增一個租戶,都需要建立新的資料庫,當租戶數量龐大時,維護與監控變得困難。
  • 硬體資源使用較高,每個租戶都有自己的資料庫,可能會增加伺服器成本。

📌 適用場景

  • 大型企業級 SaaS 服務,例如銀行、醫療系統,需要最高等級的數據隔離性。
  • 任何需要 合規性(如 GDPR、HIPAA) 的 SaaS 服務,確保不同企業的數據完全獨立。

多租戶架構的 UI 客製化

多租戶 SaaS 平台 中,除了後端的數據隔離,前端 UI(使用者介面) 也需要能夠根據不同企業的需求進行客製化。

不同企業可能有不同的品牌風格、功能需求,甚至不同的操作流程,因此 SaaS 服務需要具備「動態調整 UI」的能力,以確保每個企業的使用者都能獲得符合自身需求的體驗。

舉例來說,假設有一個 SaaS CRM(客戶關係管理)平台,該平台服務多家企業:

公司 A 想要藍色風格的 UI,並需要客戶報表功能。
公司 B 偏好綠色 UI,並希望有即時聊天支援的功能。
公司 C 需要更簡潔的 UI,並關閉部分進階功能以提升易用性。

為了實現這樣的需求,開發者通常會使用 API 來動態控制 UI 設定,確保系統能夠靈活應對不同租戶的需求,而不必為每個租戶開發獨立的前端應用程式。

透過 API 控制不同的前台設定

在多租戶 SaaS 平台中,前端 UI 需要依據租戶的設定來動態變更,而不是寫死在程式碼中

這時候,開發者可以設計一個 「UI 設定 API」,在使用者登入時,根據「企業 ID」取得該租戶的 UI 設定,並動態載入 UI 風格與功能

📌 實作方式:前端如何決定 UI 設定?

1️⃣ 用戶登入時,系統會確認該用戶所屬的企業 ID(tenant_id
2️⃣ 前端向 API 發送請求,查詢該企業的 UI 設定,例如:

GET /api/ui-config?tenant_id=companyA

3️⃣ API 回傳該租戶的 UI 設定,例如

{
  "theme_color": "#0057B8",
  "logo": "https://cdn.companyA.com/logo.png",
  "features": {
    "chat_support": false,
    "custom_reports": true
  }
}

4️⃣ 前端應用程式根據這些設定,動態調整 UI,例如:

  • 套用 theme_color 作為按鈕與背景顏色
  • 載入對應的公司 Logo
  • 判斷功能開關,例如是否顯示「客戶報表」或「即時聊天支援」功能

具體案例:多租戶 SaaS 的 UI 客製化應用

🟢 案例 1:品牌風格與視覺設定

不同企業可能希望 SaaS 平台的視覺風格與其品牌形象保持一致。這包括:

  • 主題顏色(Theme Color):按鈕、背景、文字顏色的變更。
  • 公司 Logo:登入頁、導航列中的企業標誌。
  • 字型與按鈕風格:不同企業可能使用不同的品牌字型與 UI 元件樣式。

🔹 範例:不同租戶 UI 設定

企業主題顏色企業 Logo
公司 A藍色 #0057B8companyA_logo.png
公司 B綠色 #008C3AcompanyB_logo.png
公司 C橙色 #F15A24companyC_logo.png

當用戶登入時,系統會從 API 取得這些設定,並自動套用到前端 UI,使不同租戶擁有獨立的品牌風格。

🟢 案例 2:功能開關(Feature Toggles)

不同企業可能需要不同的功能,例如:

  • A 企業需要「即時聊天支援」,B 企業不需要
  • C 企業希望啟用「進階報表功能」,而 A 企業不想要這項功能

這時,開發者可以在 API 回應中提供 features 參數,讓前端 UI 依據租戶的設定來決定顯示哪些功能,例如:

{
  "features": {
    "chat_support": true,
    "custom_reports": false,
    "dark_mode": true
  }
}

前端應用程式可以根據這些值來顯示或隱藏對應的功能按鈕與選單,而不需要重新部署程式碼。

🟢 案例 3:動態導航選單

某些企業可能希望調整系統的導航選單,例如:

  • A 企業希望導航列顯示「客戶管理、銷售報告、訂單管理」。
  • B 企業則只想要「客戶管理、訂單管理」,不需要銷售報告。

API 可以提供一個 menu_items 陣列,讓前端決定要顯示哪些選單項目:

{
  "menu_items": ["customers", "orders"]
}

前端 UI 就可以根據這個設定,只顯示企業需要的選單選項,讓 SaaS 服務更加靈活。

為什麼透過 API 來控制 UI 設定?

使用 API 來控制 UI 的優勢包括:

靈活性高:開發者可以在 不修改前端程式碼 的情況下,透過 API 來調整租戶 UI 設定,不需要為每個客戶部署不同的版本

維護成本低:只需要修改 API 回傳的設定,就能變更不同租戶的 UI,無需修改前端核心程式碼,提升開發效率。

快速擴展:當新企業加入 SaaS 平台時,只需在資料庫中新增一筆設定,無需更改程式碼或重新部署應用程式,讓 SaaS 服務能夠快速擴展至更多租戶。


多租戶 SaaS 的擴展性與安全性考量

在多租戶 SaaS 平台中,擴展性(Scalability)與安全性(Security)是兩個最重要的技術考量

由於 SaaS 平台需要同時服務大量企業,每個企業的用戶數、數據量、存取需求都可能有所不同,因此系統必須具備高效的擴展能力,並確保不同租戶的數據安全無虞。

以下將詳細說明 如何提升 SaaS 的高可用性(High Availability)與安全性(Security),以確保系統穩定運作,並防止潛在的數據洩露風險。

高可用性(High Availability)

高可用性指的是 SaaS 平台能夠持續穩定運作,並且即使發生系統故障,仍能保持最低的停機時間

由於多租戶架構下,SaaS 平台通常要同時為上百、上千家企業提供服務,因此如果系統崩潰或效能不足,會影響所有租戶的業務運行。

為了確保高可用性,SaaS 平台通常會採用以下技術:

1️⃣ 負載平衡(Load Balancing)

  • 負載平衡是一種流量管理技術,用來確保系統能夠應對大量請求,避免某一台伺服器超載而導致系統崩潰。
  • 當用戶請求進入 SaaS 平台時,負載平衡器(Load Balancer) 會將請求分配到不同的伺服器,以確保所有請求都能獲得及時回應。

🔹 典型的負載平衡架構

  1. 用戶請求首先到達負載平衡器(如 Nginx、AWS Elastic Load Balancer、Google Cloud Load Balancing)。
  2. 負載平衡器將請求分配給後端伺服器集群(Application Servers)。
  3. 如果某台伺服器故障,負載平衡器會自動將流量重新導向其他可用伺服器,避免單點故障。

📌 範例:Nginx 負載平衡設定

upstream backend_servers {
    server server1.example.com;
    server server2.example.com;
    server server3.example.com;
}

server {
    listen 80;
    location / {
        proxy_pass http://backend_servers;
    }
}

這樣的設定確保請求能夠被均勻分配到不同的伺服器,提高系統穩定性與效能。

2️⃣ 使用 CDN(內容傳遞網路)來加速前端 UI 加載速度

CDN(Content Delivery Network)是一種 分佈式網路技術,可以將 SaaS 平台的靜態資源(如 HTML、CSS、JavaScript、圖片)快取到全球各地的節點伺服器,讓用戶能夠更快載入網站內容。

🔹 為什麼需要 CDN?

  • 減少伺服器負載:如果每個用戶都直接從 SaaS 伺服器下載資源,伺服器壓力會非常大,而 CDN 可以分散流量,減少主伺服器的負擔。
  • 提升全球用戶的存取速度:CDN 會根據用戶的地理位置,選擇最近的伺服器來提供內容,降低延遲。例如,來自美國的用戶會從美國的 CDN 節點載入資源,而不是從遠端的歐洲伺服器下載。
  • 提升可用性與容錯能力:如果 SaaS 伺服器發生故障,CDN 仍然可以提供快取的內容,減少影響。

📌 範例:使用 Cloudflare CDN 來加速 SaaS 平台

curl -I https://your-saas-platform.com
# 如果有啟用 CDN,回應頭(Response Headers)會顯示:
# CF-Cache-Status: HIT (表示 CDN 已快取內容)

常見的 CDN 服務提供商包括 Cloudflare、AWS CloudFront、Akamai、Google Cloud CDN 等。

安全性與權限控管(Security & Access Control)

由於多租戶 SaaS 平台必須同時管理多家企業的數據,因此確保數據安全與存取控制是至關重要的

以下是幾種關鍵的安全技術:

1️⃣ RBAC(基於角色的存取控制,Role-Based Access Control)

RBAC 是 SaaS 平台常用的存取控制機制,它根據 「使用者的角色」 來決定該用戶能夠存取哪些資料與功能。

🔹 典型的角色權限架構

角色權限
管理員(Admin)可管理所有企業數據、設定使用者權限
企業擁有者(Owner)只能管理該企業的數據與用戶
一般員工(Employee)只能查看與自己有關的數據,如客戶名單、工作報告
訪客(Guest)只能查看公開資訊,無法修改數據

📌 範例:RBAC 權限設定(JSON 格式)

{
  "role": "employee",
  "permissions": {
    "view_customers": true,
    "edit_customers": false,
    "manage_users": false
  }
}

這樣的權限控管可以確保 不同級別的用戶只能存取適當的資料,防止未授權的數據存取。

2️⃣ 加密技術(Encryption)

SaaS 平台中的數據加密(Encryption) 主要用來防止數據在傳輸與儲存過程中被未授權存取。

🔹 常見的加密技術

  • SSL/TLS(HTTPS 加密傳輸):確保用戶端與伺服器之間的資料傳輸安全。
  • AES(Advanced Encryption Standard,高級加密標準):用於加密 SaaS 伺服器存放的敏感數據,例如用戶密碼、財務資訊等。
  • 哈希(Hashing)+ Salt:用於保護使用者密碼,確保即使資料庫被攻擊,密碼也不會被輕易破解。

📌 範例:使用 bcrypt 進行密碼加密(Python)

import bcrypt

password = "securepassword"
hashed = bcrypt.hashpw(password.encode(), bcrypt.gensalt())

print(hashed)  # 儲存這個雜湊值,而不是明文密碼

這樣即使駭客入侵了資料庫,也無法直接取得使用者的明文密碼。


結語

多租戶 SaaS 架構是一種強大的軟體設計方式,讓 SaaS 供應商能夠降低成本、提高擴展性,同時提供客戶所需的客製化功能

透過適當的資料隔離技術、API 設計與安全性措施,可以確保多租戶環境的穩定與安全。

如果你是開發者或架構師,理解多租戶 SaaS 模式,將能幫助你設計更靈活、高效的雲端應用!

Similar Posts