PostgreSQL模式(Schema)¶
PostgreSQL的模式是pgsql区别于MySQL的很大一个部分
一. 什么是模式¶
在PostgreSQL中,模式是一个命名空间(Namespace),它包含数据库对象。如表、视图、索引、数据类型、函数、操作符等
可以把它想象成操作系统中的目录(文件夹),而数据库中的表、视图等对象就是目录中的文件。
- 一个数据库包含一个或多个模式
- 一个模式包含各种数据库对象
- 同一数据库中,模式名必须是唯一的。
- 不同模式种,可以有同盟的对象(例如,schema_a.products表和schema_b.products表)
二. 为什么需要使用模式?(模式的主要作用)¶
模式的存在提供了诸多好处,时现代数据库设置中不可或缺的一部分
1. 实现了多租户架构¶
这是模式最经典的应用场景,在一个数据库中,可以为每个租户创建一个独立的模式(如tenant_1,tenant_2)。
每个租户的模式种都有完全相同的一套表结构(如users,orders),但数据是完全隔离的。
这样做比每个租户一个数据库更轻量,管理起来也更方便(备份、升级在一个数据库内完成),同时又比所有租户共享一套表(用提供tenant_id字段区分)在数据隔离和性能上更有优势。
2. 逻辑组织和管理数据库对象¶
当一个应用非常庞大,拥有数百张表时,可以把它们按照功能模块划分到不同的模式中。
例如: 将核心业务表放在core模式,用户相关表放在user模式,财务相关表放在finance模式,日志表放在log模式。
这使得数据库结构更加清晰,易于管理与维护。
3. 解决命名冲突¶
不同团队或应用可能会使用相同的表名。通过将它们放入不同的模式,可以避免冲突。
例如一个数据分析团队可能需要一个reporting模式来存放他们的中间表与视图,而不会影响主应用public模式种的表。
4. 方便权限管理¶
可以对模式级别进行权限控制,这比逐个对象授权要高效很多
例如可以授权某个用户只能访问reporting模式下的所有试图,而不能访问core模式下的任何表。
三. 默认模式: public¶
- 每个新数据库在创建时,都会自动包含一个名为pubilc的模式
- 如果没有指定任何模式,所有的数据库对象(表、视图等)默认都会创建在public模式下
- 在sql语句中,一个对象的全限定名(完全名称)是: 模式名.对象名。例如public.users.
- 如果不写模式名,如users。PostgreSQL会使用一个名为search_path的配置变量去确定去那些模式里寻找这个users对象
四. 关键概念: search_path¶
search_path是个决定对象名称解析顺序的关键配置参数
- 定义: 它是一个由模式名组成的列表。例如"$user,public"。
- 作用: 当你执行
SELECT * FROM users;时,PostgreSQL会按照search_path中列出的顺序,依次在每个模式种查找名为users的表。找到第一个匹配的即停止 - 默认值: 通常是"$user",public。
- "$user": 表示一个与当前用户同名的模式。如果存在则优先查找。
- pubilc: 然后查找public模式