在 PostgreSQL 中,数据库(Database) 和 模式(Schema) 是两个层级不同的概念,它们有明显的区别和作用。以下是具体的比较和分析:
1. 定义
-
数据库(Database):
- 是 PostgreSQL 中最高级别的数据组织单元。
- 每个数据库包含一组完全独立的表、视图、索引、模式等对象。
- 不同的数据库彼此隔离,无法直接跨数据库访问数据。
-
模式(Schema):
- 是数据库中的逻辑分组,用于组织数据库内的表、视图、函数等对象。
- 模式类似于命名空间,不同模式中的对象可以同名,彼此独立。
- 一个数据库可以包含多个模式。
2. 层级结构
PostgreSQL 的结构是分层的,层级关系如下:
Cluster(集群)
└── Database(数据库)
└── Schema(模式)
└── Table(表)
-
集群(Cluster):
PostgreSQL 的一个实例可以管理多个数据库,这些数据库共享同一个集群配置。 -
数据库(Database):
一个集群中的独立存储单元,包含若干个模式。 -
模式(Schema):
数据库内的逻辑分区,用于组织和隔离数据库中的对象。
3. 作用和用途
数据库(Database)
- 用于隔离不同的应用程序或业务系统。
- 不同数据库的对象完全隔离,访问需要通过连接不同的数据库。
- 每个数据库有自己的权限管理、数据文件和元数据。
模式(Schema)
- 用于在同一数据库中对对象进行逻辑分组。
- 提供命名空间功能,可以在同一个数据库中有多个同名的表,但位于不同的模式中。
- 适合用来分离不同的模块、业务逻辑,或者实现多租户架构。
4. 跨级访问
跨数据库访问
PostgreSQL 不支持直接跨数据库访问。要访问其他数据库中的数据,可以使用以下方法:
- 使用外部数据包装器(Foreign Data Wrapper, FDW),如
postgres_fdw
。 - 通过应用程序代码在不同的数据库之间进行数据交互。
跨模式访问
在同一个数据库中,可以直接访问其他模式中的对象,方式为:schema_name.object_name
。
- 例如:
public.table1
,其中public
是模式,table1
是表。 - 设置
search_path
后可以省略模式名,默认模式是public
。
5. 示例
数据库示例
# 创建两个数据库
CREATE DATABASE db1;
CREATE DATABASE db2;
# 使用数据库
\c db1
\c db2
db1
和db2
是完全独立的数据库,无法直接共享数据。
模式示例
-- 在数据库 db1 中创建两个模式
CREATE SCHEMA schema1;
CREATE SCHEMA schema2;
-- 在 schema1 中创建表
CREATE TABLE schema1.table1 (id SERIAL, name TEXT);
-- 在 schema2 中创建同名表
CREATE TABLE schema2.table1 (id SERIAL, description TEXT);
-- 插入数据到 schema1.table1
INSERT INTO schema1.table1 (name) VALUES ('Alice');
-- 插入数据到 schema2.table1
INSERT INTO schema2.table1 (description) VALUES ('Description');
-- 查询数据
SELECT * FROM schema1.table1;
SELECT * FROM schema2.table1;
- 这里,
schema1.table1
和schema2.table1
是两个不同的表,虽然它们在同一个数据库中。
6. 对比总结
特性 | 数据库(Database) | 模式(Schema) |
---|---|---|
级别 | 集群中的最高级别组织单元 | 数据库中的逻辑分组 |
隔离性 | 不同数据库之间完全隔离 | 不同模式之间逻辑隔离,但共享数据库资源 |
命名冲突 | 不同数据库中可以有同名对象 | 不同模式中可以有同名对象 |
跨级访问 | 不支持直接访问其他数据库,需要使用 FDW | 支持跨模式访问,通过 schema_name. 指定 |
使用场景 | 独立的业务系统,或者完全隔离的环境 | 同一业务系统的不同逻辑分组 |
7. 类比
- 数据库(Database) 更像是一个独立的仓库,彼此隔离。
- 模式(Schema) 是仓库内部的分区,用于分类存储物品。
8. 推荐使用场景
-
数据库(Database):
- 如果你的应用需要不同的隔离存储,比如不同的业务系统或开发/测试/生产环境,应使用独立的数据库。
-
模式(Schema):
- 如果你希望在同一个业务系统或应用中进行逻辑分组,或者实现模块化设计,应使用模式来组织数据对象。