1. 什么是模式(Schema)?

在 PostgreSQL 中,模式 是一个命名空间(Namespace),它包含数据库对象,如表、视图、索引、数据类型、函数、操作符等。

可以把它想象成操作系统中的目录(文件夹),而数据库中的表、视图等对象就像是目录中的文件。

一个数据库 包含一个或多个模式。
一个模式 包含各种数据库对象。
同一个数据库内,模式名必须是唯一的。
不同模式中,可以有同名的对象(例如,schema_a.products 表和 schema_b.products 表)。
2. 为什么需要使用模式?(模式的主要作用)
模式的存在提供了多种好处,是现代数据库设计中不可或缺的一部分。

实现多租户架构
这是模式最经典的应用场景。在一个数据库中,可以为每个租户创建一个独立的模式(如 tenant_1, tenant_2)。
每个租户的模式中都有完全相同的一套表结构(如 users, orders),但数据是完全隔离的。
这样做比每个租户一个数据库更轻量,管理起来也更方便(备份、升级在一个数据库内完成),同时又比所有租户共享一套表(用一个 tenant_id 字段区分)在数据隔离和性能上更有优势。
逻辑组织和管理数据库对象
当一个应用非常庞大,拥有数百张表时,可以把它们按功能模块划分到不同的模式中。
例如:将核心业务表放在 core 模式,用户相关表放在 user 模式,财务相关表放在 finance 模式,日志表放在 log 模式。
这使得数据库结构更加清晰,易于管理和维护。
解决命名冲突
不同的团队或应用可能会使用相同的表名。通过将它们放入不同的模式,可以避免冲突。
例如,一个数据分析团队可能需要一个 reporting 模式来存放他们的中间表和视图,而不会影响主应用 public 模式中的表。
方便权限管理
可以对模式级别进行权限控制,这比逐个对象授权要高效得多。
例如:可以授权某个用户组只能访问 reporting 模式下的所有视图,而不能访问 core 模式下的任何表。
3. 默认模式:public
每个新数据库在创建时,都会自动包含一个名为 public 的模式。
如果没有指定任何模式,所有的数据库对象(表、视图等)默认都会创建在 public 模式下。
在 SQL 语句中,一个对象的全限定名(完全名称)是:模式名.对象名。例如 public.users。
如果不写模式名,如 users,PostgreSQL 会使用一个名为 search_path 的配置变量来确定去哪些模式里寻找这个 users 对象。
4. 关键概念:search_path
search_path 是一个决定对象名称解析顺序的关键配置参数。

定义:它是一个由模式名组成的列表,例如 "$user", public。
作用:当你执行 SELECT * FROM users; 时,PostgreSQL 会按照 search_path 中列出的顺序,依次在每个模式中查找名为 users 的表。找到第一个匹配的即停止。
默认值:通常是 "$user", public。
"$user":表示一个与当前用户名同名的模式。如果存在,则优先查找。
public:然后查找 public 模式。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐