2013-04-10 73 views
1

我有两个Web应用程序,一个是管理员,一个是公用的。虽然两者都有相当数量的单独数据,但某个部分,我们称之为物品,都用于两者。更确切地说,项目是在管理应用程序中创建和编辑的,然后显示在公共应用程序中。Postgres - 在应用程序之间共享数据集

因为两者都使用PostgreSQL作为数据库后端,我想他们可以在数据库级别加入 - 我会在公共数据库中创建视图,通过dblink将数据传输到管理数据库。

这是一个很好的解决方案,给出以下约束?

  • 有相当多的项目,
  • 公共应用程序会做大量的搜索对数据集,
  • 这是确定的数据是公共侧有点陈旧,
  • 目前的应用程序使用相同的物理数据库服务器,但未来可能会拆分;

如果不是,您会有什么建议?

回答

4

不是将数据放在单独的数据库中,而是将所有内容放入单个数据库中,然后使用schemasaccess permissions分隔事情。

具体做法是:

  • 公众和管理的网站应该连接使用不同的 “登录的角色”(用户)。
  • 管理网站只能使用admin模式,并且公共用户不会为该模式授予USAGE
  • 其他部分的数据可以放在命名模式中,其中一些可以被两个站点完全访问,其中一些可以混合使用。 (如果将模式划分得很好,则可以使用GRANT ... ON ALL TABLES IN SCHEMAALTER DEFAULT PRIVILEGES。)
  • 如您所说,公共应该具有某些只读访问权的表可以在视图中引用。公众用户可以对这些视图进行访问,而不是对基础表进行访问。如果可以帮助您管理事物,视图可以在另一个模式中引用表,或者甚至在多个模式中引用表。
  • 或者,通过简单地不给予该表上的公共用户INSERTUPDATE特权,可以授予对整个表的只读访问权限。

你甚至可能会发现它有用考虑公众和管理不作为单独的应用,但由于不同的前端接口相同的应用程序 - 有可能是要在两者之间共享,而不是复制和代码例如,例如,

+0

相同的数据库和不同的模式可能是一个解决办法 - 我会考虑它。然而,就拆分应用程序而言,这是我的一个有意识的决定,允许稍微不同的“业务规则”以及它们的独立开发和扩展。代码重用可以通过共享库:) – 2013-04-10 12:53:13

+0

@TomsMikoss啊,我知道,共享库是有道理的。分离数据库的主要考虑因素是写入:使用复制(将管理站点连接到单个主副本)可以轻松地(相当)轻松地缩放只读操作,但公共站点需要写入的内容(例如日志)可能是值得分离出来。 – IMSoP 2013-04-10 13:46:16

+0

@TomsMikoss另一件需要考虑的问题是使用单独的数据库,您不能跨多个数据库提交原子事务,而无需通过两阶段提交(准备事务)跳过大量的环节。这意味着您可能需要更多的应用程序逻辑来同步某些更改,并确保事物不会比使用具有多个模式的单个数据库时所用的应用程序的一半少。 – 2013-04-10 23:51:25

0

让公众直接访问admin db并控制角色的权限。

Database Roles

相关问题