2010-12-15 99 views
13

我正在研究從智能卡收集數據的應用程序。我希望能夠將該應用作爲多個客戶帳戶的Web服務運行。問題是,我應該爲每個賬戶創建一個單獨的數據庫,還是應該設計一個包含所有賬戶數據的單一數據庫?首先,我認爲單個數據庫是明顯的答案,但它導致AccountID必須在表格,索引,約束,查詢,檢查等所有地方使用。單獨或獨立的數據庫爲單獨的客戶帳戶?

在這個應用程序中,沒有單個字節的數據將在帳戶之間共享。

首先,讓我們看一下一個帳戶一個單獨的數據庫會怎麼看:

CREATE TABLE CardHolder ( 
    CardHolderID int, -- primary key 
    CardHolderUniqueName nvarchar(30)); 

CREATE TABLE SmartCard (
    SmartCardID int, -- primary key 
    CardHolderID int, 
    CardUniqueName nvarchar(30)); 

再加上幾個唯一性約束,

ALTER TABLE CardHolder ADD CONSTRAINT UQ_CardHolderName UNIQUE (CardHolderUniqueName); 
ALTER TABLE SmartCard ADD CONSTRAINT UQ_CardName UNIQUE (CardUniqueName); 

現在,如果我把一切都放在一個數據庫,這意味着多個賬戶可以處理相同的CardHolders和SmartCards,但賬戶不應該看到其他數據。因此,智能卡在帳戶中是唯一的,但不在整個數據庫中。所以,每一個約束必須包括帳戶ID,

CREATE TABLE CardHolder ( 
    CardHolderID int, -- primary key 
    CardHolderUniqueName nvarchar(30), 
    AccountID int); 

CREATE TABLE SmartCard (
    SmartCardID int, -- primary key 
    CardHolderID int, 
    CardUniqueName nvarchar(30) 
    AccountID int); 

ALTER TABLE CardHolder 
    ADD CONSTRAINT UQ_CardHolderName UNIQUE (AccountID, CardHolderUniqueName); 
ALTER TABLE SmartCard 
    ADD CONSTRAINT UQ_CardName UNIQUE (AccountID, CardUniqueName); 

在實際的DB,就會有(由expirydate等等等等上市)更表,列和幾個指標的載荷和帳戶ID列都有處處納入。

看起來有點混亂,首先把所有的帳戶放在一個數據庫中,然後通過在每個表中有一個AccountID列並將它們分開,並將每個約束和索引分開。我還需要查找或創建某種行級安全性,以防止用戶訪問其他帳戶的數據。那麼,我是否有爲每個帳戶創建單獨數據庫的有效藉口,還是「真正的數據庫設計師」總是將所有內容都保存在單個數據庫中?

回答

6

在設計多租戶應用程序時,有幾件事情需要考慮,包括(正如您的問題所述)架構設計,但也應考慮諸如許可證成本,可伸縮性等事宜。包括優點和缺點,包括This article describes the three most common approaches for designing a multi-tenant application。一探究竟。

+1

標記爲答案,因爲你的鏈接給了我最多的信息。我仍然無法決定該怎麼做。我將開始爲多個租戶設計一個數據庫,因爲如果我改變主意,將其更改爲隔離的數據庫比將數據庫重新設計爲一個數據庫設計更容易。 – Batibix 2010-12-16 19:28:26

+0

這個鏈接真的很棒。我學到了很多。它應該是我可能購買的建立Saas的書的一部分。 – racl101 2015-10-21 23:30:04

+2

真的希望你在這裏發佈這篇文章的肉,因爲鏈接腐爛,現在這是一個死的答案。 – 2017-10-03 18:33:34

2

恕我直言,只有一種方法。多個數據庫。

  1. 這不僅會決不能被共享
  2. 它還使模式來彼此獨立地改變這種完全安全的數據。我的意思是,隨着時間的推移,也許一個租戶比其他所有的柚木都大,因此必須滿足特殊需求。
  3. 備份,恢復操作和策略可以很容易地制定了獨立的數據庫
  4. 約束和獨特性是更簡單,更自然地表達
+1

我將無法在沒有運行的情況下爲每個租戶提供獨立架構進入維護噩夢與分歧的應用程序版本等 – Batibix 2010-12-15 12:42:52

+0

你仍然受益於1 + 3 + 4 – 2010-12-15 12:47:38

+1

是的,尤其是4,因爲唯一性在單個數據庫中變得非常奇怪。從概念上講,在單獨的數據庫中,一切似乎都更有意義。雖然我不確定維護和雲託管成本。 – Batibix 2010-12-15 13:08:11

5

我們已經走了下來這裏兩條路線。對於那些不需要自定義的小型客戶,我們有一個共享數據庫,併爲企業客戶提供了一個單獨的數據庫(以及針對該問題的應用程序代碼庫)。

兩者都有其優缺點。在共享數據庫中,所有需要的都是一個錯誤的查詢,其中有人忘記使用客戶端,並將數據暴露給其他客戶端。五年來,我看到這種情況只發生過一次,但這是一個讓我們成爲客戶的重大噩夢。如果你走這條路線,確保你有一個好的QA團隊,在發佈代碼之前檢查它是否完全符合要求。如果您的數據庫具有架構,則可以在架構中使用視圖來防止其他客戶端數據的數據訪問。如果客戶只有他們觀點的權利,那麼他們就不會看到其他人的數據。儘管如此,這是更多的工作。

但是單獨的數據庫可能成爲維護變更的噩夢。但是,如果您銷售升級產品,則需要這樣做,因爲不是每個客戶都會購買每次升級。只要確保你有一個好的跟蹤機制來知道每個客戶端在哪個版本上,並且你使用源代碼控制來跟蹤所有數據庫版本的變化,所以你可以輕鬆升級。

如果您不打算進行自定義,您可能會發現單獨的數據庫無論如何都會導致該方向。當他們在一個共享數據庫中時,告訴他們不是很容易。

此外,我們發現有些定製對其他客戶有幫助,但是由於它們是在單獨的應用程序和數據庫中開發的,因此不同團隊爲不同客戶重新開發,最終有6種方式做同樣的事情。這對於那些將客戶數據導入數據庫的客戶(如客戶)工作的人來說是一大痛苦。我個人更喜歡一種數據庫方法。

關於整合或分離需要關注數據報告的另一點。如果報告只能由客戶完成,那麼您可以將它們分開,但如果您需要報告(例如您自己的內部財務報告)以確定合併數據,那麼如果您擁有統一數據庫,則會更容易。我提出這個問題是因爲人們往往會在設計完成之後纔會忘記報告,當你這樣做的時候會導致一些相當不好的問題。

+0

如果你有一個使用配置文件來設置數據庫的工具,這個問題就變得不那麼重要了 – 2010-12-15 14:48:26