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

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

推荐答案

In Oracle:

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

In PostgreSQL:

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

In MySQL:

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

In Microsoft SQL Server:

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

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

  1. 这取决于实现,也取决于是否需要目录名来标识对象.catalogschemadatabase的含义在不同的实现中有所不同.

  2. 是的,目录是数据存储的抽象.我认为它也应该被定义为一个独立的命名空间,但并不是所有的SQL引擎都这样做.

  3. Databaseschema在所有供应商中都有很好的定义.Catalog有时是"数据库"的同义词(至少在Oracle和Postgres中是如此),有时是"模式"的同义词,有时是两者的同义词.术语catalog通常还表示元数据收集(也称为系统表).

  4. 程序员应该使用Schema来组织SQL数据库中的工件,因为它代表一个带有访问控制层的逻辑名称空间.

Mysql相关问答推荐

添加日期日期,而不使用addDate

将值代入子查询

在时间戳上搜索大的MySQL表很慢

MySQL-如何检测时间戳中的一天

MySQL滑动窗口动态间隔?

带有值分隔的MySQL分组不起作用

MySQL工作台的编码问题

如何对 varchar() 数据值使用聚合窗口函数?

如何在 Shopware 6 DAL 中实施 Haversine 公式?

sequelize 中最好的更新方法是什么

如何创建将行转换为列的 MySQL 查询?

如何从将分钟、天、月和年存储在不同列中的表中查询数据

处理 Visits 表中数百万行的最佳方法是什么?

mysql - 如何加入表中的动态列

在 WHERE 子句中使用 CASE

从终端访问 MAMP 的 MySQL

是否可以在内部连接期间重命名连接列?

安装 mysql-python (Windows)

按 15 分钟间隔对 mysql 查询进行分组

在 Ubuntu 上安装 mysql gem 的困难