模式优于多个数据库的示例

rla*_*ter 2 schema

在一些数据库系统(例如 PostgreSQL 和 MS SQL Server)中,有一个schema的概念。有很多问题询问什么是模式以及如何使用它们;这是一个很好的。通常答案归结为“命名空间”和“权限”。然而,我仍然不清楚的是,为什么模式比添加新数据库有任何优势。不同的数据库允许拥有单独的命名空间和权限分配。

有人可以在 PostgreSQL 中提供一个示例,其中单个数据库中的多个模式比没有模式的多个数据库具有优势吗?从纯粹的组织角度来看,它们似乎是等效的。

mus*_*cio 6

Postgres 文档确实提供了答案,尽管它分布在许多部分中。它以下一般声明开始

每个连接不能访问多个数据库。[...] 数据库在物理上是分开的,访问控制在连接级别进行管理。如果一个 PostgreSQL 服务器实例要容纳应该分开并且大部分彼此不知道的项目或用户,因此建议将它们放在单独的数据库中。如果项目或用户相互关联并且应该能够使用彼此的资源,则它们应该放在同一个数据库中,但可能放在不同的模式中。

有些事情只能在数据库级别控制,而不能在模式级别控制。他们之中:

  • 对象权限。除非明确撤销,否则数据库所有者角色权限会覆盖在对象(架构、表等)级别授予的任何权限。
  • 数据库连接权限。您可以在数据库级别控制哪些用户可以从哪些 IP 地址连接到它。
  • 配置参数。这允许您针对其特定工作负载调整每个数据库。
  • 维护。虽然您可以使用pg_dump和备份和恢复单个模式pg_restore,但时间点恢复、日志传送和流式复制等操作在数据库(实际上是集群)级别工作。

在同一台服务器上拥有多个数据库的小缺点是维护和缓存每个数据库的系统目录的存储和内存开销。

如果您经常查询不同命名空间中的表,您可能更喜欢多个模式而不是数据库。它可以在不同的数据库查询表,但这需要建立外国数据包装,其带来额外的维护和可能的性能影响。

简而言之,如果您的应用程序需要严格的安全隔离(例如,一个命名空间的管理员不得访问其他命名空间),或者它们的工作负载模式非常不同,并且您不需要查询不同数据库中的表,则应该选择实现多个数据库。

另一方面,如果所有命名空间的工作负载模式都相同,并且您不需要严格的职责分离,并且经常跨命名空间查询表,那么您可能应该在单个数据库中使用模式来实现数据的逻辑隔离. 这通常是多租户应用程序的首选方案。

  • +1000。感谢您最终就该主题提供了正确的、有区别的答案。 (2认同)