PostgreSQL 层次结构详解:实例 → 数据库 → 模式 → 表
maiaimei 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
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
⚠️ 关键点:
- 一个实例 不能同时 属于多个数据目录
- 不同实例之间 完全隔离(用户、数据库、配置都独立)
📌 类比:实例 ≈ 一栋大楼(有独立的水电系统)
# 2️⃣ 数据库(Database)
| 项目 | 说明 |
|---|---|
| 是什么 | 逻辑上的数据容器 |
| 创建 | CREATE DATABASE mydb; |
| 包含 | 多个 Schema |
| 隔离级别 | 逻辑隔离(同一实例内) |
-- 查看所有数据库
\l
-- 创建数据库
CREATE DATABASE mydb;
-- 连接数据库
\c mydb
1
2
3
4
5
6
7
8
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
2
3
4
5
6
7
8
⚠️ 关键点:
- Schema 解决 命名冲突(不同 Schema 可以有同名表)
- 通过
search_path控制默认查找顺序
-- 设置搜索路径
SET search_path TO sales, public;
1
2
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
2
3
4
5
📌 类比:表 ≈ 房间里的柜子(真正存放东西的地方)
# 三、完整命名规则
实例(端口 + 数据目录)
└── 数据库(CREATE DATABASE)
└── 模式(CREATE SCHEMA)
└── 表(CREATE TABLE)
1
2
3
4
2
3
4
对象完整限定名:
schema_name.table_name -- 同一数据库内
"schema"."table" -- 带引号(大小写敏感)
1
2
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
2
3
4
# 五、一句话总结
| 层级 | 一句话理解 |
|---|---|
| 实例 | 一个运行中的 PostgreSQL 服务(进程 + 内存) |
| 数据库 | 一套独立的数据集合(逻辑隔离) |
| 模式 | 数据库内的命名空间(组织对象) |
| 表 | 真正存储数据的结构 |
💡 记忆口诀:
实例管进程,数据库管隔离,模式管分组,表管数据。