PostgreSQL.md
... ...
@@ -941,7 +941,24 @@ SELECT param_name paramName, param_value paramValue FROM base_process_spec bps;
941 941
SELECT param_name "paramName", param_value "paramValue" FROM base_process_spec bps
942 942
```
943 943
944
+### 2.9 PostgreSQL 的 schema
944 945
946
+PostgreSQL和MySQL比较大的区别是引入了schema的概念,使用的时候需要切换schema.
947
+默认 schema,新建库自带 public;search_path 控制查找顺序。
948
+
949
+
950
+
951
+| 维度 | PostgreSQL | MySQL | 一句话差异 |
952
+| ----------------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ |
953
+| **1. 层级结构** | 集群 → 数据库 → **schema** → 表/函数/序列… | 实例 → **database** → 表… | PG 比 MySQL 多一层真正的 “schema” 命名空间。 |
954
+| **2. schema≈database?** | ❌ 不是一回事;一个db里可建N个schema。 | ✅ `CREATE DATABASE` 与 `CREATE SCHEMA` 几乎等价;一个 db 就是一个 schema 空间。 | MySQL 里换 db 就是换 schema;PG 里换 schema 仍在同一个 db 内。 |
955
+| **3. 默认 schema** | 新建库自带 `public`;`search_path` 控制查找顺序。 | 每个 db 自带 `sys`/`mysql`/`information_schema`,但用户表都在 db 根下;无 “默认 schema” 概念。 | PG 靠 `search_path` 实现“跨 schema 透明访问”,MySQL 靠 `USE db`。 |
956
+| **4. 命名空间隔离** | 同一db内不同schema可存在同名对象(`hr.emp`, `sales.emp`)。 | 同一实例内不同 db 对象名可重复;**一个 db 内部**表名必须唯一。 | PG 的细粒度隔离粒度是 schema,MySQL 是 database。 |
957
+| **5. 跨空间访问** | 只要 `GRANT` 就可以 `hr.emp` 访问 `sales` 的表,仍在**一个连接**里。 | 跨库访问需 `db.table` 语法,但**事务/外键/临时表**不能跨库;往往要开多个连接。 | PG 一个连接即可跨 schema;MySQL 跨 db 容易,跨库逻辑隔离重。 |
958
+| 6. 代码/ORM 差异 | 需写 `SET search_path = tenant1, public;` 或在连接串里配 ` | | |
959
+
960
+**一句话概括:**
961
+在 PostgreSQL 里,schema 只是“数据库内部的一个文件夹”,拿来把表/函数/序列等对象分门别类;而在 MySQL 里并没有这层中间结构,它的“数据库”概念同时扮演了 PostgreSQL 的 database + schema 两个角色。
945 962
946 963
947 964