Postgresql - 每个用户一个数据库或每个用户一个数据库

问题描述:

我正在开发一个基于Web的业务应用程序,其中每个客户都需要拥有自己的数据(请考虑basecamphq.com类型的模型)为了实现可扩展性和易用性,我更愿意拥有一个数据库,每个客户都可以获得过滤版本的数据。问题是如何保证他们保持沙盒到他们自己的数据。试图在代码中执行它看起来像是一场等待发生的灾难。我知道Oracle有一种方法可以将基于登录ID的每个查询添加一个where子句,但是Postgresql有没有类似的东西?Postgresql - 每个用户一个数据库或每个用户一个数据库

如果没有,是否有我可以使用的不同设计模式(例如为每个过滤客户创建每个表的视图)?

更糟糕的情况是,拥有1000个100M数据库与拥有单个1TB数据库的性能/内存开销是多少?我需要提供基于每个客户的备份/恢复功能,这对单个数据库来说是非常简单的,但如果他们与其他客户共享数据库则会更加棘手。

您可能想要考虑在您的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

模式加继承的表可能适用于此,创建您的主表,然后将表继承到提供公司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