2011-04-06 130 views
19

讓我們說我需要設計一個數據庫,它將託管多家公司的數據。現在出於安全和管理的目的,我需要確保不同公司的數據被正確隔離,但我也不想在10臺不同的服務器上啓動10個MySQL進程來爲10家公司提供數據。用mysql數據庫做這件事的最好方法是什麼?如何設計一個多租戶mysql數據庫

回答

25

有多種租戶數據庫的方法。討論時,他們通常分爲三類。

  • 每個租戶一個數據庫。
  • 共享數據庫,每個 租戶一個模式。
  • 共享數據庫,共享模式。租戶標識符(租戶密鑰)將每一行與正確的租戶相關聯。

MSDN在pros and cons of each designexamples of implementations上有一篇很好的文章。

+0

在這種情況下可以分片幫助,每個分片包含單獨客戶端的數據嗎? – gaurav 2011-04-07 16:36:08

+1

頻譜從「無共享」(每個租戶一個數據庫)運行到「共享所有」(每個表中的租戶密鑰)。 Sharding接近頻譜的「共享所有」結尾。我希望它能夠讓單個租戶的災難恢復變得更簡單。如果您可以想象單個服務器上的「共享所有」系統,爲單個租戶恢復數據意味着只恢復每個共享表中的某些行。這不僅僅是簡單的。 – 2011-04-07 21:14:19

+0

MySQL支持單個數據庫多個Sachems嗎? – Sagar 2016-01-09 07:39:16

4

假設您將在單個MySQL實例上運行一個MySQL數據庫 - 有幾種方法可以區分屬於哪些人。 最明顯的選擇(至少對我來說),將創建一個複合主鍵如:

CREATE TABLE some_table (
id int unsigned not null auto_increment, 
companyId int unsigned not null, 
.. 
.. 
.., 
primary key(id, company_id) 
) engine = innodb; 

,然後通過改變主鍵的companyId部分企業之間的區分。 通過這種方式,您可以將所有公司的所有數據都放在同一個表/數據庫中,並且在應用程序級別,您可以控制哪個公司與哪個companyId綁定並確定要爲某個公司顯示哪些數據。

如果這不是你正在尋找的 - 我的道歉誤解你的問題。

+0

我的想法是在一定程度上隔離數據,以便每個公司數據庫都有唯一的登錄ID。因此,可以說,如果在A公司發生了一些安全性妥協,公司B的數據仍然應該是安全的。 – gaurav 2011-04-06 17:15:58

+0

@ I.Tyger你甚至可以編碼嗎? – 2018-03-09 14:43:08

+0

@ I.Tyger,因爲你發表了一條沒有道理的評論。我想你在這裏學習,沒關係。祝你好運。不要張貼廢話,這是無聊的看到紅點的煩人。 – 2018-03-09 15:11:11

1

給定一個特定的數據庫用戶,您可以爲組指定允許其訪問數據的公司的用戶成員資格。

我認爲你將有一個Companies表,所以只需在CompaniesMySQLUsers之間創建一個一對多的關係或類似的東西。

然後,您所有的疑問的情況下,只匹配基礎上,UserID

1

你有沒有考慮創建每個公司不同的schemaCompanyID

儘管如此,您應該嘗試更準確地定義您想要實現的目標。

例如,如果要確保硬件故障不會損害多個公司的數據,則必須創建不同的實例並在不同的節點上運行它們。

如果你想確保從A公司的人看不到屬於公司數據B,你可以這樣做,在應用層面爲每馬修PK答案,例如

如果你想確保雖然有人設法破壞安全性並針對數據庫運行任意SQL,但您仍然需要比這更強大的功能。

如果您希望能夠獨立備份數據,以便您可以在週日和公司A上安全地備份公司C,並且能夠僅恢復公司C,那麼純粹基於應用程序的解決方案就不會幫幫我。

+0

我想要做你最後一點提到的事情。獨立進行備份,在一定程度上保持數據隔離,以便在一家公司收到大量流量時,將其移至另一臺機器上的全新實例。 – gaurav 2011-04-06 17:53:02

+0

然後看看架構,我沒有太多的mySql經驗,所以我可能會缺少一些特定於實現的細節,但我認爲這是您的案例中最好的方法。 – 2011-04-06 22:08:23

3

簡單的方法是:對於每個共享表,添加一個表示SEGMENT_ID的列。爲每個客戶分配適當的SEGMENT_ID。然後在SEGMENT_ID上爲每個客戶羣創建視圖,這些視圖將保持每個客戶的數據分離。通過這種方法,信息可以被共享,使得簡單的操作&開發(存儲過程也可以被共享)變得簡單。

+4

SEGMENT_ID是一個可怕的名字 – 2014-01-24 08:05:51

+7

TENANT_ID是完美的名字 – Nabeel 2014-07-16 13:13:37