pg入门2—pg中的database和schema有什么区别
在 PostgreSQL(简称 PG)和 MySQL 中,Database
和 Schema
是两个不同层次的概念,而在 MySQL 中,Database
和 Schema
常常被混用。通过结合这两种数据库的设计,我们可以更清晰地理解它们之间的区别。
1. PostgreSQL 中的 Database
和 Schema
Database(数据库):
- 作用: PostgreSQL 的
Database
是一个独立的存储实体,拥有独立的元数据、表、视图、函数等。 - 隔离性: 每个数据库是完全独立的,数据库之间的数据和表无法直接相互访问。即便是在同一个 PostgreSQL 实例下,不同数据库的表也是互相隔离的,无法跨数据库直接执行查询。
- 连接方式: 用户需要单独连接到一个数据库实例内的某个具体数据库,才能对其中的对象进行操作。
Schema(模式):
- 作用:
Schema
是数据库中的逻辑分组,用于组织数据库对象(如表、视图、函数等)。它充当命名空间的角色,使得同一数据库中的不同 schema 可以拥有同名的对象(如表),而不会发生冲突。 - 隔离性: Schema 提供的是逻辑上的分离,而不是物理隔离。同一数据库内的多个 schema 可以通过 SQL 语句跨 schema 进行操作,只需使用
schema.object_name
的语法来指定具体的 schema。 - 典型场景: 多个业务模块的数据可以在同一个数据库中使用不同的 schema 进行管理和隔离。
2. MySQL 中的 Database
和 Schema
Database
和Schema
是同义词: 在 MySQL 中,Database
和Schema
本质上是同一个概念,只是名称不同。MySQL 没有像 PostgreSQL 那样明确的 schema 概念。在 MySQL 中,创建一个数据库等同于创建一个 schema,二者是可以互换的。- 作用: MySQL 的数据库或 schema 主要用于逻辑组织数据表、视图等对象。在 MySQL 中,数据库是数据库对象(如表)的容器。
- 隔离性: MySQL 数据库之间也是完全隔离的,类似于 PostgreSQL 的
Database
隔离性。不同数据库之间的表无法直接跨数据库查询。不过 MySQL 可以通过联合查询或设置跨数据库访问权限
来实现数据库间的数据交互。
3. PostgreSQL 和 MySQL 的主要区别
特性 | PostgreSQL (Database ) | PostgreSQL (Schema ) | MySQL (Database/Schema ) |
---|---|---|---|
概念层次 | 实例中的顶层数据存储单位 | 数据库内部的逻辑命名空间 | 实例中的顶层数据存储单位 |
隔离性 | 数据库之间完全隔离 | Schema 之间逻辑隔离,物理不隔离 | 数据库之间完全隔离 |
命名冲突 | 不同数据库间命名无冲突 | 同一数据库内 schema 可用来避免冲突 | 数据库间命名无冲突 |
跨Schema /Database 访问 | 无法跨 Database 查询数据 | 可以跨 Schema 查询数据 | 可以跨数据库访问(通过授权或使用全限定名) |
典型应用 | 用于项目或应用级别的隔离 | 用于数据库内部的逻辑分组和模块化 | 用于项目或应用级别的隔离 |
4. 对比示例
PostgreSQL 示例
假设你有一个 PostgreSQL 实例:
- Database:
company_db
- Schema 1:
sales
(销售部门) - Schema 2:
hr
(人力资源部门)
- Schema 1:
你可以在 sales
schema 中创建一个 employees
表,也可以在 hr
schema 中创建一个同名的 employees
表。访问时需要指定 schema,如 sales.employees
或 hr.employees
,但它们都位于同一个数据库 company_db
中。
MySQL 示例
假设你有一个 MySQL 实例:
-
Database(也称作
Schema
):company_sales
(销售部门)employees
表
-
Database:
company_hr
(人力资源部门)employees
表
在 MySQL 中,company_sales.employees
和 company_hr.employees
位于两个不同的数据库,隔离性类似于 PostgreSQL 的 Database
层。
5. 总结
- 在 PostgreSQL 中,
Database
是物理隔离的顶级容器,而Schema
是数据库内的逻辑分组单位。 - 在 MySQL 中,
Database
和Schema
是同一个概念,用来组织和隔离数据表等对象,没有 PostgreSQL 中类似的 schema 概念。