在我们探索 Oracle 和 PostgreSQL 之间的区别之前,让我们简要地定义一下模式的一般含义。在数据库系统中,模式通常是指数据库对象(如表、视图、索引和过程)的集合。模式为这些对象提供了一个命名空间,确保每个对象在该空间中都是唯一可识别的。
但是,模式的概念可能会因所使用的数据库系统而异。在 Oracle 和 PostgreSQL 中,模式都提供了一种组织对象的机制,但它们在与用户交互、访问控制和对象管理的方式上面大不相同。
让我们先回顾一下 Oracle 中模式的工作原理,然后看看 PostgreSQL 如何以不同的方式处理模式。
Oracle 的模式:以用户为中心的模型
模式是用户的同义词
在 Oracle 中,模式实质上等同于用户帐号。在 Oracle 中创建用户时,会自动为该用户创建一个模式。模式包含该用户拥有的所有对象(表、视图、索引等)。因此,Oracle 数据库中的用户和模式之间存在一对一的关系。
此结构意味着每个用户在数据库中都有自己的工作区,并且他们创建的任何对象都存储在自己的模式中。用户和模式的这种紧密耦合简化了访问控制,因为只有拥有模式的用户才能访问和修改该模式中的对象,除非向其他用户授予明确的权限。
例如,如果名为 SCOTT 的用户拥有一个名为 EMPLOYEES 的表,则该表在 Oracle 中的完全限定名称将为 SCOTT.EMPLOYEES。此命名约定清楚地标识了用户和他们拥有的对象。
用户模式分离:一个关键限制
Oracle 中用户和模式的关系存在一些限制,尤其是在多个用户需要使用同一组数据库对象的环境中。由于每个用户都有自己的模式,因此在用户之间共享对象可能会变得很麻烦。例如,如果多个用户需要访问 SCOTT.EMPLOYEES 表,则必须向每个用户授予明确的权限,或者使用同义词来引用对象,而不需要在查询中包含模式名。
随着用户和共享对象的数量增加,此限制可能会导致访问控制机制和对象管理更加复杂。此外,Oracle 中的模式设计和数据库组织往往围绕用户帐号展开,这使得它在大型协作环境中的灵活性较低,在这些环境中,对象可能不属于特定用户,而是属于部门、团队或应用程序。
PostgreSQL 的模式:灵活的命名空间模型
作为命名空间的模式
在 PostgreSQL 中,模式充当了数据库中的逻辑命名空间,它们不直接与任何特定用户绑定。这种区别很重要:与 Oracle 中每个用户都拥有一个模式不同,PostgreSQL 允许您在同一数据库中创建多个模式,并且这些模式可以包含不同用户拥有的对象。
PostgreSQL 模式的这种灵活用法,提供了更具扩展性和模块化的组织级别。PostgreSQL 中的模式可以看作是将相关对象组合在一起的文件夹或容器。这使得在同一数据库中按功能、部门或应用程序组织对象变得更加容易。
例如,考虑一个用于人力资源应用程序的 PostgreSQL 数据库。您可能有一个名为 hr 的模式,其中包含 employees、departments 和 salaries 等表。employees 表的完全限定名称为 hr.employees。多个用户可以访问此模式,并且其中的对象可以由不同的用户拥有。
解耦用户和模式
与 Oracle 中用户和模式之间的严格耦合不同,PostgreSQL 具有更大的灵活性。用户可以跨多个模式拥有对象,并且一个模式可以包含不同用户拥有的对象。这种分离提供了对数据库组织和访问的更精细的控制,这在有很多用户和应用程序的环境中尤其有用。
例如,在 PostgreSQL 中,您可以为组织中的每个部门(例如,人力资源、财务、销售)创建一个模式,并且在每个模式中,您可以拥有由不同用户拥有的对象。这提供了一个更清晰的结构,并允许用户们在同一数据库中工作,而无需频繁跨越模式的边界,或依赖于模式特定的权限。
PostgreSQL 还允许您控制搜索路径,在没有带模式前缀的情况下引用对象时,该路径可确定搜索模式的顺序。通过配置搜索路径,您可以允许用户访问对象,而无需始终指定模式名称,从而简化查询。
Oracle 和 PostgreSQL 模式之间的主要区别
现在我们已经在 Oracle 和 PostgreSQL 中建立了模式的基本概念,让我们来总结一下每个数据库系统在处理模式的方式上面的主要区别:
模式和用户之间的关系
Oracle
模式与用户帐号直接关联,用户与其模式之间存在一对一的关系。模式实质上表示用户在数据库中的工作区。
PostgreSQL
模式独立于用户。多个用户可以拥有同一模式中的对象,单个用户可以拥有多个模式中的对象。这允许使用更灵活和模块化的方法,来组织数据库。
模式创建
Oracle
模式是在创建用户帐号时自动创建的。您不会在 Oracle 中显式创建模式;相反,您需要创建一个用户,然后就自动为该用户创建了模式。
PostgreSQL
模式是使用命令CREATE SCHEMA显式创建的。您可以在单个数据库中创建多个模式,这些模式可用于逻辑地组织对象,而无需考虑拥有这些对象的用户。
对象组织
Oracle
对象会组织在创建对象的用户关联的模式中。每个用户的对象都存储在他们自己的模式中,这会使用户之间共享对象变得更加复杂。
PostgreSQL
对象会组织在模式中,并且这些模式不与单个用户相关联。多个用户可以共享同一个模式,从而更容易按功能或应用程序而不是按用户来组织对象。
访问控制
Oracle
由于模式与用户相关联,因此访问控制与用户权限密切相关。如果用户需要访问其他用户模式中的对象,则必须授予明确的权限,或者必须使用同义词来简化对象访问。
PostgreSQL
访问控制更加灵活,因为多个用户可以在同一模式中拥有和共享对象。可以在模式级别授予权限,从而允许用户访问对象,而无需在每个查询中引用模式名。
完全限定的对象名称
Oracle
使用schema_name.object_name的格式引用对象。由于每个模式都对应一个用户,这意味着对象通常引用为user_name.object_name。
PostgreSQL
使用schema_name.object_name的格式引用对象,但由于模式独立于用户,因此模式名称反映的是数据库的逻辑组织,而不是拥有该对象的用户。
大型环境中的模式管理
Oracle
由于用户和模式之间存在一对一的关系,因此在大型环境中管理模式可能更加复杂。这种结构通常需要更精细的访问控制机制,并且会使对象共享更加麻烦。
PostgreSQL
模式和用户的分离,使管理大型环境变得更加容易。模式可用于对相关对象进行分组,并且用户可以跨多个模式访问对象,而无需复杂的访问控制机制。
实际注意事项:从 Oracle 迁移到 PostgreSQL
对于切换到 PostgreSQL 的 Oracle 专业人员来说,最重要的调整可能是用户和模式的解耦。在 Oracle 中,以用户为中心的模式,意味着数据库的组织会围绕单个用户帐号展开。但是,在 PostgreSQL 中,模式成为一种独立于用户的更灵活的组织工具。
以下是从 Oracle 模式的模型过渡到 PostgreSQL 的一些实用技巧:
重新思考数据库的组织
在 Oracle 中,您可能习惯于为每个应用程序或部门创建新用户,并依赖用户和模式之间的一对一关系来组织对象。在 PostgreSQL 中,您应该考虑基于功能、应用模块或组织部门创建模式,而不是基于单个用户。
例如,不要为 HR 部门创建单独的用户,而是创建一个 hr 模式,并在该模式中组织所有的相关对象(例如,表、视图、函数)。然后,可以根据需要给多个用户授予对此模式的访问权限。
利用搜索路径
PostgreSQL 允许您配置搜索路径,该路径确定系统如何解析未完全限定的对象名称(即当您未指定模式时)。通过适当设置搜索路径,您可以简化查询,无需不断地指定模式名。
例如,如果您的大部分工作都是在 hr 模式中完成的,则可以将搜索路径设置为首先包含 hr,这样您就可以引用 employees 等表,而无需在每个查询中为对象添加模式名的前缀。
使用角色进行访问控制
在 PostgreSQL 中,角色(可以表示一个用户或一组用户)用于管理对对象进行跨模式访问。通过有效地使用角色,您可以控制谁有权访问哪些模式,以及他们可以对这些模式中的对象执行哪些操作。
例如,您可以创建一个 read_only 角色,该角色有权对 hr 模式中的表中进行 SELECT,然后将此角色分配给需要对 HR 数据进行只读访问的用户。
规划模式的迁移
如果要将 Oracle 数据库迁移到 PostgreSQL,则需要仔细规划如何将 Oracle 用户和模式映射到 PostgreSQL 模式。由于 Oracle 将模式直接与用户绑定,因此,如果您遵循相同的结构,您最终可能会在 PostgreSQL 中得到许多模式。
相反,请考虑根据相关对象的逻辑关系,而不是其用户所有权,将相关对象合并到更少的模式中。这有助于简化您的数据库结构,使其更方便长期管理。
结论:利用 PostgreSQL 的灵活性
从 Oracle 过渡到 PostgreSQL,需要转变您对模式和数据库组织的看法。在 Oracle 中,模式与用户紧密耦合,从而创建了一个简单但有时具有限制性的环境。另一方面,PostgreSQL 将模式与用户分离,为组织和管理数据库对象提供了更灵活和可扩展的系统。
通过了解 Oracle 和 PostgreSQL 中模式在工作方式上的差异,对于如何在 PostgreSQL 中构建数据库和管理访问控制,您就可以做出更明智的决策了。凭借其灵活的命名空间模型和强大的模式管理工具,PostgreSQL 提供了一个强大的平台,以促进协作和可扩展的方式组织复杂的数据库。