根据我使用 Oracle 的经验,典型的划分单元是模式。Oracle 中的模式的使用更像是在 SQL Server 或 PostgreSQL 中使用数据库。它们代表用户和对象的逻辑分离。物理分离通常使用表空间来完成。表空间是一组存储数据的物理文件。模式可以共享或使用不同的表空间。每个模式有一个表空间是不常见的。它们通常共享几个表空间,甚至通常只共享一个。
考虑到这一点,为了更直接地回答您的问题,
1) 与任何其他数据库一样,您可以指定对象所属的架构:
CREATE TABLE MY_SCHEMA.TABLE_X ( X NUMBER )
如果两个CREATE
语句的模式不同,那么它将创建不同的对象。Oracle 的不同之处在于每个用户的默认模式都会发生变化。默认架构始终是当前连接的架构/用户。因此,如果您像这样省略架构:
CREATE TABLE TABLE_X ( X NUMBER )
那么隐含的模式是当前连接的模式/用户。因此,如果我以 身份登录MY_SCHEMA
,则上面的内容相当于第一个示例。当作为两个不同的用户连接时,隐含的模式将不同,并且两个用户之间的 DDL不等效。因此,如果您不指定模式,则运行相同的语句将创建两个不同的对象。
如果两个对象在同一个表空间中,则它们可以存储在同一个物理文件中。(如果您没有显式创建一个并且在创建模式时没有指定不同的默认表空间,它们很可能在 USERS 表空间中。)无论如何,它们仍然是两个完全独立的对象。
如果您像第一个示例中那样明确指定模式,那么无论谁执行 DDL 都是等效的(尽管权限可能会阻止某些用户执行它)。所以它会导致创建一次对象,并且尝试第二次创建它会导致错误,除非你正在使用CREATE OR REPLACE
或类似的东西。
2)我不知道这个问题的答案,但正如我所说,在Oracle中,基本的分离单元通常是模式,而不是数据库。我相信您所问的问题是模式以它们的方式使用的很大一部分原因。在同一台机器/实例上拥有多个实际数据库在 Oracle 中比在其他数据库中困难得多(如果不是不可能的话),因此拥有一个具有许多模式的数据库要简单得多。