我正在研究從智能卡收集數據的應用程序。我希望能夠將該應用作爲多個客戶帳戶的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列並將它們分開,並將每個約束和索引分開。我還需要查找或創建某種行級安全性,以防止用戶訪問其他帳戶的數據。那麼,我是否有爲每個帳戶創建單獨數據庫的有效藉口,還是「真正的數據庫設計師」總是將所有內容都保存在單個數據庫中?
標記爲答案,因爲你的鏈接給了我最多的信息。我仍然無法決定該怎麼做。我將開始爲多個租戶設計一個數據庫,因爲如果我改變主意,將其更改爲隔離的數據庫比將數據庫重新設計爲一個數據庫設計更容易。 – Batibix 2010-12-16 19:28:26
這個鏈接真的很棒。我學到了很多。它應該是我可能購買的建立Saas的書的一部分。 – racl101 2015-10-21 23:30:04
真的希望你在這裏發佈這篇文章的肉,因爲鏈接腐爛,現在這是一個死的答案。 – 2017-10-03 18:33:34