mysql - 目录、模式、用户和数据库实例之间的关系

要比较不同供应商(Oracle、SQL Server、DB2、MySQL 和 PostgreSQL)的数据库,我如何才能唯一地识别任何对象,我是否需要目录?例如,在 Java 的 DatabaseMetadata 中,我至少应该指定目录和模式 fooPattern。

目录真的只是数据存储的抽象吗?

最佳答案

在甲骨文中:

  • 服务器实例 == 数据库 == 目录 == 由同一执行引擎管理的所有数据
  • schema == 数据库中的命名空间,与用户帐户相同
  • 用户 == 架构所有者 == 命名帐户,与架构相同,谁可以连接到数据库,谁拥有架构并可能在其他架构中使用对象
  • 要识别正在运行的服务器中的任何对象,您需要(模式名称 + 对象名称)

在 PostgreSQL 中:

  • 服务器实例 == 数据库集群 == 由同一执行引擎管理的所有数据
  • 数据库 == 目录 == 数据库集群中的单个数据库,与同一数据库集群中的其他数据库隔离
  • schema == 数据库中的命名空间,默认使用 public
  • 用户 == 命名帐户,可以连接到数据库,分别拥有和使用每个允许的数据库中的对象
  • 要识别正在运行的服务器中的任何对象,您需要(数据库名称 + 架构名称 + 对象名称)

在 MySQL 中:

  • 服务器实例 == 未使用目录标识,只是一组数据库
  • 数据库 == 架构 == 目录 == 服务器内的命名空间。
  • 用户 == 指定帐户,可以连接到服务器并使用(但不能拥有 - 没有所有权概念)一个或多个数据库中的对象
  • 要识别正在运行的服务器中的任何对象,您需要(数据库名称 + 对象名称)

在 Microsoft SQL Server 中:

  • 服务器实例 == 托管数据库集
  • 服务器中的数据库 == 命名空间限定符,很少称为目录
  • schema == owner == 数据库中的命名空间,与数据库角色绑定(bind),默认使用 dbo
  • 用户 == 命名帐户,可以连接到服务器并使用(但不能拥有 - 架构作为所有者)一个或多个数据库中的对象
  • 要识别正在运行的服务器中的任何对象,您需要(数据库名称 + 所有者 + 对象名称)

所以我认为你的问题的答案是:

  1. 取决于实现,是否需要目录名称来标识对象。 catalogschemadatabase 的含义因实现而异。

  2. 是的,目录是数据存储的抽象。我觉得它也应该定义为一个自包含的隔离命名空间,但并不是所有的 SQL 引擎都这样做。

  3. Databaseschema 由所有供应商很好地定义。 目录 有时是“数据库”的同义词(至少在 Oracle 和 Postgres 中),有时是“模式”的同义词,有时是两者的同义词。 catalog 一词也经常表示元数据集合(也称为系统表)。

  4. Schema 是程序员应该用来组织 SQL 数据库中的工件,因为它表示具有访问控制层的逻辑命名空间。

https://stackoverflow.com/questions/7942520/

相关文章:

mysql - MySQL中是否可以有基于函数的索引?

MySQL - 条件外键约束

mysql - 如何在 bash 上运行 MySQL 命令?

mysql - 如何在 MySQL 中正确使用 CASE..WHEN

mysql - 遇到需要满足多个条件的 MySQL Join 问题

mysql - 如何为 MySQL 中的每个组选择第一行?

mysql - 从 cygwin 连接到 mysql

mysql - 总锁数超过锁表大小

mysql - SQL 性能 UNION 与 OR

mysql - 在 Windows 上的 XAMPP 中哪里可以更改 lower_case_tabl