过去与 SQL Server 合作过很多次,我很同情试图弄清楚 Oracle 是如何组织事物的,因为我正在为同样的事情而苦苦挣扎。我下面的评论来自 SQL Server 2000 和 2003,如果从那时起事情发生了变化,请原谅我。
以前的响应者很有帮助。我认为这里的一个有问题的假设是 SQL Server 和 Oracle 之间存在精确的“级别”等效性。我所说的“级别”是指在您上面图解的层次结构中占据相同空间的东西(顺便说一句,我认为这是一个很好的起点,但可能需要在几个地方进行一些编辑,因为例如,您如何在 Oracle 层次结构中绘制“用户”和“模式”,我可能会将它们并排放置。)我认为这些概念“级别”在数据库平台之间并不完全匹配。
Oracle 中的模式在某种程度上等同于 SQL Server 中的单独数据库,但并不完全等同。
我想说的是,SQL Server 中的数据库之间的“墙”——不是一个确切的技术术语,但很好——比 Oracle 中的模式之间的“墙”要高一些。其他人可能不同意,但这是我的理由:
一个。Oracle 中的模式是纯粹的逻辑构造。它表示谁拥有对象的所有权。它与对象的物理位置或布局无关。表空间(正交概念,如先前的海报所述)表示物理物体的位置。一个表空间可以保存多个模式中的对象,反之亦然。在 SQL Server 中,这两个概念在某种程度上合并为一个——数据库或多或少既是表空间又是模式,尽管在 SQL Server 的数据库中的某些方面,您拥有多个拥有不同对象所有权的所有者。这可能会有点令人困惑,因为我记得(已经有几年了)如果不使用 NT 身份验证,则用户是在服务器级别定义的,然后必须“链接”到各个数据库中的用户。
湾。我记得发现它更容易,或者至少更简单一点,以确保 SQL Server 中两个单独数据库的用户无法访问相对其他用户的数据库,而不是我在 Oracle 中找到的。
C。因为 SQL Server 中的 DB 代表物理存储和逻辑所有权,所以您可以分离 DB 并将其移动到另一个 SQL Server 实例并附加它。您不能使用 Oracle 中的模式来执行此操作。我的意思是,您可以将数据导出或备份到另一台服务器和另一个模式,但这一切都需要至少一些脚本等或至少在企业管理器中进行大量点击。它没有为您提供 SQL Server 中的一键式“分离 DB”选项,这使您更容易理解 SQL Server DB 是您可以或多或少来回移动的单元数据库。
总而言之,我认为任何一种选择都行得通。也就是说,1) 在每个应用程序的每个实例中创建两个单独的 Oracle 实例,或 2) 在一个 Oracle 实例中创建两个单独的架构。
每个选项都有优点和缺点。选项 1 可能需要更多的设置和配置工作,但也会为每个 DB 提供更多的分离、独立性、拥有单独硬件的能力等。选项 2 会更简单一些,但可以减少数据之间的分离,并增加配置错误或其他允许一个模式的用户访问另一个模式的风险。这也意味着您必须更加小心,以防止编写查询访问一个模式中的数据的人不会使用所有 CPU 和 IO 资源并使用户在另一个模式上挨饿。
另外,是的,您可以在 12c 中使用可插拔数据库。但是,考虑到您需要提出这些问题(不要羞耻,只是指出您所处的位置),这让我对推荐更容易变得更复杂的设置犹豫不决。
TL;DR -- SQL Server 不是 Oracle,Oracle 也不是 SQL Server。任何一个选项都有效,每个选项都有优点和缺点。