过去我在很多情况下都使用SQL Server,所以我理解在尝试弄清楚Oracle的组织结构时的困难。我的评论基于SQL Server 2000和2003版本,如果有改变请谅解。
之前的回答很有帮助。我认为这里一个有问题的假设是SQL Server和Oracle之间存在确切的“层级”等价性。我所说的“层级”是指占据上述层次结构中相同空间的东西(顺便说一句,我认为这些层次结构是一个好的起点,但可能需要在某些地方进行一些编辑,例如你如何在Oracle层次结构中将“用户”和“模式”画出来,我可能会将它们并列放置)。我不认为这些概念“层级”在数据库平台之间完全匹配。
在Oracle中,模式在某种程度上等效于SQL Server中的单独数据库,但并非完全相同。
我认为,在SQL Server中,数据库之间的“墙壁”(不是确切的技术术语,但也无妨)比Oracle中模式之间的“墙壁”更高一些。其他人可能会持不同意见,但这是我的推理:
a. Oracle中的模式是纯逻辑结构。它表示对象的所有者。它与对象的物理位置或布局无关。表空间(由之前的一个回答者指出是一个正交的概念)表示对象的物理位置。表空间可以容纳在多个模式中的对象,反之亦然。在SQL Server中,这两个概念有点合并为一个——数据库在某种程度上既是表空间又是模式,但在某些方面,在SQL Server中的一个DB中,则具有多个拥有者及各自对象所有权。这可能会有点混淆,因为我记得(已经是几年前的事了),如果不使用NT身份验证,则用户是在服务器级别定义的,然后必须“链接”到单个DB中的用户。
b. 我记得在SQL Server中,相对于Oracle,我发现更容易或至少简单一些来确保两个用户无法访问另一个用户的数据库。
c. 因为SQL Server中的DB代表了物理存储和逻辑所有权,所以你可以拆卸DB并将其移动到另一个SQL Server实例中并附加它。而在Oracle中则做不到。我的意思是,你可以将数据导出或备份到另一台服务器和另一个模式,但这都需要至少一些脚本编写或相当数量的点击操作。它没有像SQL Server中一键“Detach DB”选项那样使得SQL Server DB成为你可以在数据库之间来回移动的单元,这使得它更容易理解。
总而言之,我认为两种选项都可以。即,1)为每个应用程序在Oracle中创建两个单独的实例,每个实例中有一个模式;2)在一个Oracle实例中创建两个单独的模式。
每个选项都有利弊。选项1可能需要更多的设置和配置工作,但也会给您更多的隔离、独立性和能够为每个DB提供单独的硬件等。选项2会简单得多,但数据之间的分离性更低,配置出错或其他问题可能导致一个schema的用户访问另一个schema的数据。这也意味着您必须更加小心,确保查询一个schema中的数据的人不会使用所有CPU和IO资源,从而使另一个schema的用户无法使用。
另外,是的,您可以在12c中使用可插拔数据库。然而,考虑到您需要问这些问题(没有羞耻之处,只是指出您所在的位置),我对推荐可能更复杂的设置感到犹豫。
总之,SQL Server不是Oracle,Oracle不是SQL Server。任何选项都可以起作用,各有利弊。