【发布时间】:2011-12-18 01:21:00
【问题描述】:
要比较不同供应商(Oracle、SQL Server、DB2、MySQL 和 PostgreSQL)的数据库,我如何才能唯一地识别任何对象,我是否需要目录?例如,在 Java 的 DatabaseMetadata 中,我至少应该指定目录和模式 fooPattern。
目录真的只是数据存储的抽象吗?
【问题讨论】:
标签: mysql sql-server oracle postgresql db2
要比较不同供应商(Oracle、SQL Server、DB2、MySQL 和 PostgreSQL)的数据库,我如何才能唯一地识别任何对象,我是否需要目录?例如,在 Java 的 DatabaseMetadata 中,我至少应该指定目录和模式 fooPattern。
目录真的只是数据存储的抽象吗?
【问题讨论】:
标签: mysql sql-server oracle postgresql db2
在甲骨文中:
在 PostgreSQL 中:
public
在 MySQL 中:
在 Microsoft SQL Server 中:
dbo
所以我认为你的问题的答案是:
这取决于实现,是否需要目录名称来识别对象。 catalog、schema 和 database 的含义因实现而异。
是的,目录是数据存储的抽象。我觉得它也应该定义为一个自包含的隔离命名空间,但并不是所有的 SQL 引擎都这样做。
Database 和 schema 由所有供应商很好地定义。 目录 有时是“数据库”的同义词(至少在 Oracle 和 Postgres 中),有时是“模式”的同义词,有时是两者的同义词。 catalog 一词也经常表示元数据集合(也称为系统表)。
Schema 是程序员应该用来组织 SQL 数据库中的工件,因为它表示具有访问控制层的逻辑命名空间。
【讨论】:
TABLE_CAT:iserver, TABLE_SCHEM:null, TABLE_NAME:accountgroups, TABLE_TYPE:TABLE, REMARKS:。 TABLE_SCHEM 字段为空白。基于此输出,我预计我在目录字段中看到的内容会出现在架构字段中。 JDBC定义是否可能关闭,或者MYSQL目录与模式相同?
对于 DB2,模式用作名称空间。因此,如果您想在数据库中唯一标识一个对象,您会说 *schema.object_name*。这是实现多租户的一种非常方便的方法。您可以为数据库中的每个租户使用单独的架构。这提供了与安全性和管理方面的良好分离。单个 DB2 数据库中可以有 32K 模式。
DB2 中的目录只是系统表的集合,其中包含有关数据库的元数据。通常,直接访问目录对象被认为是一种不好的做法。最好使用您的 API(例如 JDBC)提供的工具来探索目录及其包含的元数据。
DB2 还有其他抽象层。您可以在同一台机器上运行多个 DB2 实例。每个实例可以管理 256 个独立的数据库(每个都有 32K 模式)。服务器上的 DB2 实例数量仅受可用内存量的限制。在某个时间点,我们有 120 个 DB2 实例(每个实例有一个数据库和 10 个连接)在 Amazon EC2 m1.large 上运行。 您还可以在单个服务器上安装多个 DB2。在测试您计划迁移到的新版本时,它很有用。虽然经常忘记切换到正确的安装,但我确实觉得它令人困惑。
【讨论】:
db2 -x "select count(*) from syscat.schemata"返回33069
filiprem 在帖子中提到的关于 mysql 的内容似乎不正确。根据以下链接,在 mysql 中,jdbc 目录对应于数据库。不支持 jdbc 架构。
【讨论】: