PostgreSQL 层次结构详解:实例 → 数据库 → 模式 → 表

2026/11/5 PostgreSQL

PostgreSQL 的逻辑存储层次结构可以用一句话概括:

一个实例包含多个数据库,一个数据库包含多个模式,一个模式包含多个表(及其他对象)。

下面逐层拆解,并配上类比帮助理解。


# 一、整体层次图

┌─────────────────────────────────────────┐
│           PostgreSQL 实例(Instance)      │  ← 一个进程集群 + 共享内存
│  ┌───────────────────────────────────┐  │
│  │        数据库(Database)           │  │  ← 如:mydb、postgres
│  │  ┌─────────────────────────────┐  │  │
│  │  │      模式 / Schema           │  │  │  ← 如:public、sales
│  │  │  ┌─────────┐ ┌───────────┐ │  │  │
│  │  │  │  表(Table)│ │ 视图/函数 │ │  │  │
│  │  │  └─────────┘ └───────────┘ │  │  │
│  │  └─────────────────────────────┘  │  │
│  │  ┌─────────────────────────────┐  │  │
│  │  │      模式 / Schema           │  │  │  ← 如:hr
│  │  │  ┌─────────┐ ┌───────────┐ │  │  │
│  │  │  │  表(Table)│ │ 序列/类型 │ │  │  │
│  │  │  └─────────┘ └───────────┘ │  │  │
│  │  └─────────────────────────────┘  │  │
│  └───────────────────────────────────┘  │
│  ┌───────────────────────────────────┐  │
│  │        数据库(Database)           │  │  ← 如:testdb
│  └───────────────────────────────────┘  │
└─────────────────────────────────────────┘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

# 二、逐层详解

# 1️⃣ 实例(Instance / Cluster)

项目 说明
是什么 一组 PostgreSQL 进程 + 共享内存 + 数据目录($PGDATA)
启动方式 pg_ctl start / systemctl start postgresql
包含 多个数据库
隔离级别 进程级隔离(不同实例监听不同端口)
# 一个实例 = 一个数据目录 + 一个端口
/usr/pgsql-15/bin/postgres -D /var/lib/pgsql/15/data -p 5432
1
2

⚠️ 关键点:

  • 一个实例 不能同时 属于多个数据目录
  • 不同实例之间 完全隔离(用户、数据库、配置都独立)

📌 类比:实例 ≈ 一栋大楼(有独立的水电系统)


# 2️⃣ 数据库(Database)

项目 说明
是什么 逻辑上的数据容器
创建 CREATE DATABASE mydb;
包含 多个 Schema
隔离级别 逻辑隔离(同一实例内)
-- 查看所有数据库
\l

-- 创建数据库
CREATE DATABASE mydb;

-- 连接数据库
\c mydb
1
2
3
4
5
6
7
8

⚠️ 关键点:

  • 不同数据库之间 不能直接互访表(除非用 dblink 或 postgres_fdw)
  • 用户和角色是 实例级 的,但权限是 数据库级 的

📌 类比:数据库 ≈ 大楼里的一套公寓(水电独立,但共用大楼结构)


# 3️⃣ 模式(Schema)

项目 说明
是什么 数据库内的 命名空间(namespace)
创建 CREATE SCHEMA sales;
包含 表、视图、函数、类型、序列等
默认 public
-- 创建模式
CREATE SCHEMA sales;

-- 在指定模式中建表
CREATE TABLE sales.orders (id serial PRIMARY KEY, amount numeric);

-- 查看模式
\dn
1
2
3
4
5
6
7
8

⚠️ 关键点:

  • Schema 解决 命名冲突(不同 Schema 可以有同名表)
  • 通过 search_path 控制默认查找顺序
-- 设置搜索路径
SET search_path TO sales, public;
1
2

📌 类比:Schema ≈ 公寓里的房间(客厅、卧室、书房)


# 4️⃣ 表(Table)

项目 说明
是什么 实际存储数据的结构
创建 CREATE TABLE ...
归属 属于某个 Schema
完整名 database.schema.table(跨库不行)
-- 完整写法
CREATE TABLE mydb.sales.orders (...);  -- ❌ 不能在 CREATE TABLE 中指定 database

-- 正确方式:先 \c mydb,再
CREATE TABLE sales.orders (...);        -- ✅
1
2
3
4
5

📌 类比:表 ≈ 房间里的柜子(真正存放东西的地方)


# 三、完整命名规则

实例(端口 + 数据目录)
 └── 数据库(CREATE DATABASE)
      └── 模式(CREATE SCHEMA)
           └── 表(CREATE TABLE)
1
2
3
4

对象完整限定名:

schema_name.table_name        -- 同一数据库内
"schema"."table"              -- 带引号(大小写敏感)
1
2

❌ PostgreSQL 不支持 database.schema.table 这种跨库引用


# 四、权限体系对应关系

层级 权限示例
实例 创建数据库、创建角色
数据库 CONNECT、CREATE、TEMP
模式 USAGE、CREATE
表 SELECT、INSERT、UPDATE、DELETE
-- 典型授权链
GRANT CONNECT ON DATABASE mydb TO user1;
GRANT USAGE ON SCHEMA sales TO user1;
GRANT SELECT ON ALL TABLES IN SCHEMA sales TO user1;
1
2
3
4

# 五、一句话总结

层级 一句话理解
实例 一个运行中的 PostgreSQL 服务(进程 + 内存)
数据库 一套独立的数据集合(逻辑隔离)
模式 数据库内的命名空间(组织对象)
表 真正存储数据的结构

💡 记忆口诀:

实例管进程,数据库管隔离,模式管分组,表管数据。