e99649b6f2e25f4ec907888e290b1220f705c904
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 |