mysql - 目录、模式、用户和数据库实例之间的关系
要比较不同供应商(Oracle、SQL Server、DB2、MySQL 和 PostgreSQL)的数据库,我如何才能唯一地识别任何对象,我是否需要目录?例如,在 Java 的 DatabaseMetadata 中,我至少应该指定目录和模式 fooPattern。
目录真的只是数据存储的抽象吗?
在甲骨文中:
- 服务器实例 == 数据库 == 目录 == 由同一执行引擎管理的所有数据
- schema == 数据库中的命名空间,与用户帐户相同
- 用户 == 架构所有者 == 命名帐户,与架构相同,谁可以连接到数据库,谁拥有架构并可能在其他架构中使用对象
- 要识别正在运行的服务器中的任何对象,您需要(模式名称 + 对象名称)
在 PostgreSQL 中:
- 服务器实例 == 数据库集群 == 由同一执行引擎管理的所有数据
- 数据库 == 目录 == 数据库集群中的单个数据库,与同一数据库集群中的其他数据库隔离
- schema == 数据库中的命名空间,默认使用
public
- 用户 == 命名帐户,可以连接到数据库,分别拥有和使用每个允许的数据库中的对象
- 要识别正在运行的服务器中的任何对象,您需要(数据库名称 + 架构名称 + 对象名称)
在 MySQL 中:
- 服务器实例 == 未使用目录标识,只是一组数据库
- 数据库 == 架构 == 目录 == 服务器内的命名空间。
- 用户 == 指定帐户,可以连接到服务器并使用(但不能拥有 - 没有所有权概念)一个或多个数据库中的对象
- 要识别正在运行的服务器中的任何对象,您需要(数据库名称 + 对象名称)
在 Microsoft SQL Server 中:
- 服务器实例 == 托管数据库集
- 服务器中的数据库 == 命名空间限定符,很少称为目录
- schema == owner == 数据库中的命名空间,与数据库角色绑定(bind),默认使用
dbo
- 用户 == 命名帐户,可以连接到服务器并使用(但不能拥有 - 架构作为所有者)一个或多个数据库中的对象
- 要识别正在运行的服务器中的任何对象,您需要(数据库名称 + 所有者 + 对象名称)
所以我认为你的问题的答案是:
取决于实现,是否需要目录名称来标识对象。 catalog、schema 和 database 的含义因实现而异。
是的,目录是数据存储的抽象。我觉得它也应该定义为一个自包含的隔离命名空间,但并不是所有的 SQL 引擎都这样做。
Database 和 schema 由所有供应商很好地定义。 目录 有时是“数据库”的同义词(至少在 Oracle 和 Postgres 中),有时是“模式”的同义词,有时是两者的同义词。 catalog 一词也经常表示元数据集合(也称为系统表)。
Schema 是程序员应该用来组织 SQL 数据库中的工件,因为它表示具有访问控制层的逻辑命名空间。
https://stackoverflow.com/questions/7942520/