数据库概念中数据库、Catalog 和 Schema 的含义
按照 SQL 标准的解释,在 SQL 环境下 Catalog
和 Schema
都属于抽象概念,可以把它们理解为一个容器或者数据库对象命名空间中的一个层次,主要用来解决命名冲突问题。
从概念上说,一个数据库系统包含多个 Catalog,每个 Catalog 又包含多个 Schema,而每个 Schema 又包含多个数据库对象(表、视图、字段等),反过来讲一个数据库对象必然属于一个 Schema,而该 Schema 又必然属于一个 Catalog,这样我们就可以得到该数据库对象的完全限定名称从而解决命名冲突的问题了;例如数据库对象表的完全限定名称就可以表示为:Catalog名称.Schema名称.表名称
。
这里还有一点需要注意的是,SQL 标准并不要求每个数据库对象的完全限定名称是唯一的,就象域名一样,如果喜欢的话,每个 IP 地址都可以拥有多个域名。
从实现的角度来看,各种数据库系统对 Catalog 和 Schema 的支持和实现方式千差万别,针对具体问题需要参考具体的产品说明书,比较简单而常用的实现方式是使用数据库名作为 Catalog 名,使用用户名作为 Schema 名,具体可参见下图:
最后一点需要注意的是 Schema 这个单词,它在 SQL 环境下的含义与其在数据建模领域中的含义是完全不同的。在 SQL 环境下,Schema 是一组相关的数据库对象的集合,Schema 的名字为该组对象定义了一个命名空间,而在数据建模领域,Schema(模式)表示的是用形式语言描述的数据库的结构;简单来说,可以这样理解,数据建模所讲的 Schema<也就是元数据>保存在 SQL 环境下相应 Catalog 中一个 Schema<名叫DEFINITION_SCHEMA>下的表中,同时可以通过查询该 Catalog 中的另一个 Schema<名叫INFORMATION_SCHEMA>下的视图而获取,具体细节不再赘述。
另外结合 MySQL 官方的 MySQL administrater
数据库管理工具理解一下所谓的schema 和 catalog:
点击那个 catalogs
,下面就出来了所有的 database
。
总结就是:
- 数据库:指的是说 MySQL(或者说 Oracle 等)
- schema: 指的是说当你 create database db_name 时,
db_name
就是一个 schema - catalog: 指的是所有的 database 目录,就像上图显示的那样,将 MySQL 原来的(mysql,infomation_schema)及后来新建的的 database 的集合。