2013-02-08 64 views
0

問題:物理數據分離

比方說,我們有5個客戶端。目前,每個客戶端都擁有自己的數據庫副本。這是因爲有數百萬行,我們不希望加載一個客戶端的數據庫來干擾另一個客戶端數據庫的性能。

這不是一個最佳的設計,因爲:

  • 管理爲每個客戶單獨的連接不靈活,
  • 變化需要跨多個數據庫進行傳播,並
  • 一個新的數據庫需要爲每個新客戶創建。

問:

是否有可能包括所有的數據到一個數據庫中,但有某種形式的客戶端數據之間的物理隔離,以便它也執行具有幾個數據庫?

這種隔離不是在表(或模式)級別,而是在行級別。例如,我不希望每個客戶端都有單獨的Employee表(如Employee_ClientA,Employee_ClientB,Employee_ClientC),而是一個Employee表和ClientID外鍵。這意味着表格中的數據需要物理分離。

回答

1

你的問題概括已與多租戶數據庫架構做的選項。我爲您添加了多租戶標籤。在進行更改之前,您可能需要單擊它並閱讀其他多租戶問題和答案。 This SO answer總結了大部分權衡,並鏈接到Microsoft的文章。

是否有可能包括所有的數據到一個數據庫中,但有 某種形式的客戶端數據之間的物理隔離,使其 執行同樣有幾個數據庫?

沒有,真的沒有。 物理隔離意味着每個客戶端必須擁有自己的數據庫或自己的模式。

而是一個帶有ClientID外鍵的Employee表。這意味着 內的數據需要在物理上分開。

在所有客戶端之間共享一個表,並通過其client_id隔離每個客戶端的行不是物理隔離。這是邏輯隔離。選擇特定客戶端的行取決於在WHERE子句中使用它們的client_id。

在同一個硬件上不會得到類似的性能,因爲每個表將包含原始表的行數的五倍,並且每個查詢都必須在WHERE子句中包含「client_id」。您可能可能對於少數客戶端和少量行獲得了類似的性能,但隨着數據庫的增長,差異將更加明顯。

3

如果性能是您主要關注的問題,那麼可以使用Partitioned Tables功能將單獨的客戶端數據放在單獨的文件組中。

如果要限制每個客戶端的數據其他客戶的可見性,你可能會考慮在Granting Row-Level Permissions in SQL Server

+0

將這些表分區到單獨的物理硬盤上的文件組是否有意義? – davenewza

+0

這個*可能*爲OP,誰在談論5個客戶。但是這種分區技術是一種奇特的用途,它被設計用於擴展,而不是作爲多租戶架構的核心結構組件。在更一般的情況下這是不實際的。不支持x86硬件上超過1000個分區,默認限制是15000個分區(在具有16個RAM的服務器上)。 –