2010-05-11 512 views
3

我正在開發一個基於Web的業務應用程序,其中每個客戶都需要擁有自己的數據(請考慮basecamphq.com類型的模型)爲了實現可擴展性和易用性,我更願意擁有一個數據庫,每個客戶都可以獲得過濾版本的數據。問題是如何保證他們保持沙盒到他們自己的數據。試圖在代碼中執行它看起來像是一場等待發生的災難。我知道Oracle有一種方法可以將基於登錄ID的每個查詢添加一個where子句,但是Postgresql有沒有類似的東西?Postgresql - 每個用戶一個數據庫或每個用戶一個數據庫

如果沒有,是否有我可以使用的不同設計模式(例如爲每個過濾客戶創建每個表的視圖)?

更糟糕的情況是,擁有1000個100M數據庫與擁有單個1TB數據庫的性能/內存開銷是多少?我需要提供基於每個客戶的備份/恢復功能,這對單個數據庫來說是非常簡單的,但如果他們與其他客戶共享數據庫則會更加棘手。

回答

2

您可能想要考慮在您的PostgreSQL安裝中添加Veil

+0

看起來它可以工作。它確實需要爲每個用戶單獨登錄,這會使連接池變得更加困難。你有沒有在生產現場運行它的經驗? – 2010-05-11 05:35:54

+0

@John:不,不是在生產 - 幾個月前我正在爲一家公司做諮詢演出,他們考慮過這種可能性,但決定採取不同的路線。 – 2010-05-11 06:09:51

+0

我想你必須忍受每個客戶的登錄,否則任何沙箱都是徒勞的,因爲它會是客戶端或應用程序端,直接訪問會破壞你的沙箱。 – MkV 2010-05-11 08:52:56

0

模式加繼承的表可能適用於此,創建您的主表,然後將表繼承到提供公司ID或名稱字段默認的每個客戶模式的表。

爲每個客戶設置每個模式的權限並設置每個用戶的模式搜索路徑。在每個模式中使用相同的表名,以便查詢保持不變。

+0

我發現這個演示文稿( http://aac2009.confreaks.com/06-feb-2009-14-30-writing-multi-tenant-applications-in-rails-guy-naor.html)瞭解basecamp如何進行模式分離。他們這樣做的方式是在控制器中設置搜索路徑之前/之後的過濾器。我的應用程序是使用apache公共連接池以java編寫的,所以我不確定它是否可行。我會檢查並看看我有什麼選擇 – 2010-05-11 13:00:41

相關問題