跳转至

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模式

五. 模式的常用操作(SQL命令)

1. 创建模式

CREATE SCHEMA my_schema;
-- 或者为指定用户创建模式
CREATE SCHEMA schema_name AUTHORIZATION user_name;