2014-02-18 123 views
16

我在思考數據庫設計問題。任何幫助將不勝感激。多個數據庫與具有邏輯分區數據的單個數據庫

我們正在設計其中有20桌(新功能開發期間可能增長到約30最高)的應用程序

技術棧

MVC4,.NET 4.X,實體框架5 ,SQL Server 2012中,ASP.NET成員框架

沒有用戶的

我們打算以滿足約1000 CLI誰平均擁有20個用戶。

問題

我們應該設計數據庫,以這樣的方式,該表是邏輯分區的應用程序,即所有客戶端使用相同的表與GUID分區的數據分開。

OR

轉到多個數據庫可能被證明是在新功能發佈和bug修復困難。但可能允許縮放?

注意事項:其中一個表具有一個存儲文件(每個記錄最大5MB)

除了這一點,我們需要考慮的會員框架表,我們將延伸到另一個自定義表和二進制列邏輯上將用戶映射到分區GUID。

回答

45

你會希望你曾經使用獨立的數據庫:

  • 如果你想將權限授予數據庫本身給客戶或超級用戶。
  • 如果您曾經想恢復一個客戶端的數據庫而不影響其他數據。
  • 如果管理您的數據和數據泄露事宜存在監管問題,並且您遲遲才發現只有通過分開的數據庫才能滿足這些規定。
  • 如果您想要將您的客戶數據輕鬆移動到多個數據庫服務器或以其他方式向外擴展,或將更大/更重要的客戶移動到不同的硬件上。在世界的不同部分。
  • 如果您想要輕鬆歸檔和停用舊客戶數據。
  • 如果您的客戶關心他們的數據被孤立,並且他們發現您做了其他事情。
  • 如果您的數據被傳喚,您必須生成整個數據庫,而不僅僅是一個客戶端的數據。
  • 當你忘記保持警惕,只有一個查詢滑過,不包括AND CustomerID = @CustomerID。提示:使用腳本權限工具或模式,或者包含所有包含WHERE CustomerID = SomeUserReturningFunction()或其組合的表格的表格。
  • 當您在應用程序級別獲取權限錯誤並且客戶數據暴露給錯誤的客戶時。
  • 當您希望爲不同的客戶端提供不同級別的備份和恢復保護時。
  • 一旦你意識到構建一個基礎設施來創建,配置,配置,部署或以其他方式啓動/停止新數據庫是值得的投資,因爲它會迫使你去改善它。
  • 如果您不允許某些人需要訪問多個客戶數據的可能性,並且您需要在Customer之上建立抽象層,因爲WHERE CustomerID = @CustomerID現在不會削減它。

你會很高興你使用獨立的數據庫:

  • 當飛行員部署到一個客戶完全爆炸和其他999個客戶是完全不受影響。而且您可以從備份中恢復以解決問題。

你會希望你用了一個單一的數據庫:

  • 當你發現影響所有1000個客戶和部署修復1000個數據庫是很難的錯誤。
  • 當您在數據庫級別獲取權限錯誤並且客戶數據暴露給錯誤的客戶時。
  • 如果您不允許某類人員需要訪問所有數據庫的子集(可能是兩個客戶合併)的可能性。
  • 當您嘗試在單個服務器上增長到32,767個客戶/數據庫時,發現這是SQL Server 2012中的最大值。
  • 當您意識到管理1,000多個數據庫比您想象中的更大的噩夢。
  • 當您意識到僅僅通過在表中添加一些數據就無法讓新客戶上車,並且您必須運行一堆可怕且複雜的腳本來創建,填充和設置新數據庫的權限。

只是因爲我列出了更多的原因,並不意味着它更好。

有些讀者可能會從這個MSDN文章獲得價值:Multi-Tenant Data Architecture

+0

感謝您的利弊清單。在我將答案標記爲答案之前,將等待進一步的答案。乾杯! – Ahsan

+0

讓人們可以訪問多組數據聽起來像是一個數據倉庫實現的工作...... – jcolebrand

+1

@jcolebrand這聽起來太棒了......除非訪問必須是可讀/寫的。在這種情況下,提出了一個更困難的挑戰! – ErikE

5

如果你是闖民宅的2009建築「多租戶」,微軟有一個很好的文章,是值得閱讀here。它顯示了"isolated" (multiple db)"shared" (single db)之間的一些比較。一般來說,當租客(客戶)的#號大時共享,但當每個租戶的大小很大時,推薦使用單獨的方法。

但是,這些考慮只能由經驗豐富的開發人員計算。

如果您仍設法使用isolated (multiple db)體系結構,那麼您仍然可以使用won't get direct benefit in performance when they are still run at same instance。如果您使用shared (single db)架構,請考慮使用int而不是​​或sequential guid,如果您仍然需要使用它。

+0

建議使用int而不是guid,這會產生更好的索引性能。 – Ahsan

+0

在guid中使用int是否真的如此?爲什麼微軟自己在他們的共同點和其他產品中使用GUID? – ilans

+0

@ilanS那麼你可以在這裏閱讀它:http://www.sqlskills.com/blogs/kimberly/guids-as-primary-keys-andor-the-clustering-key/。通常有人使用2個字段,1個int/bigint作爲主鍵,1個guid作爲非聚簇索引。對於行選擇,他們使用guid。對於加入/等他們使用PK。這是爲了安全問題。 – Fendy

相關問題