Skip to content

PostgreSQL 模式

概述

模式(Schema)是数据库中的命名空间,用于包含和组织数据库对象,如表、视图、索引和函数等。通过模式可以将数据库对象划分为逻辑组,避免不同对象之间的命名冲突。

关键概念

  • 命名空间:模式为数据库对象提供逻辑分组
  • 访问控制:不同模式可以设置不同的权限
  • 多模式支持:一个数据库中可以创建多个模式
  • 默认模式public 是 PostgreSQL 的默认模式,未指定模式时对象默认创建在 public

模式操作

创建模式

sql
-- 创建新模式
CREATE SCHEMA myapp;

-- 创建模式并指定所有者
CREATE SCHEMA myapp AUTHORIZATION app_user;

-- 创建模式并同时在其中创建对象
CREATE SCHEMA myapp
    CREATE TABLE products (...);

-- 仅在模式不存在时创建
CREATE SCHEMA IF NOT EXISTS myapp;

删除模式

sql
-- 删除空模式
DROP SCHEMA myapp;

-- 级联删除模式及其所有内容
DROP SCHEMA myapp CASCADE;

-- 仅在模式存在时删除
DROP SCHEMA IF EXISTS myapp;

设置搜索路径

搜索路径(search_path)决定了 PostgreSQL 在未指定模式名时查找对象的顺序:

sql
-- 查看当前搜索路径
SHOW search_path;

-- 设置搜索路径
SET search_path TO myapp, public;

-- 为指定用户设置默认搜索路径
ALTER ROLE postgres SET search_path = 'myapp, public';

使用模式

对象限定名

通过 模式名.对象名 的方式显式访问特定模式中的对象:

sql
-- 访问指定模式中的表
SELECT * FROM myapp.users;
SELECT * FROM myapp.products;

-- 在指定模式中创建对象
CREATE TABLE myapp.orders (...);
CREATE INDEX idx_users_name ON myapp.users(name);

查看模式信息

sql
-- 在 psql 中列出所有模式
\dn

-- 通过系统表查看模式详细信息
SELECT
    schema_name,
    schema_owner,
    schema_acl
FROM information_schema.schemata
ORDER BY schema_name;

-- 查看指定模式中的所有表
SELECT table_name
FROM information_schema.tables
WHERE table_schema = 'myapp';

实用示例

多租户应用

通过为每个租户创建独立模式,实现数据隔离:

sql
-- 为每个租户创建模式
CREATE SCHEMA tenant_alice;
CREATE SCHEMA tenant_bob;

-- 在租户模式中创建表
CREATE TABLE tenant_alice.users (...);
CREATE TABLE tenant_bob.users (...);

-- 切换租户时设置搜索路径
SET search_path TO tenant_alice, public;

按功能模块组织

将数据库对象按业务模块划分到不同模式中:

sql
-- 创建功能模块模式
CREATE SCHEMA accounting;
CREATE SCHEMA inventory;
CREATE SCHEMA sales;

-- 在各模块模式中创建表
CREATE TABLE accounting.journal_entries (...);
CREATE TABLE inventory.warehouse_locations (...);
CREATE TABLE sales.orders (...);

小结

模式的核心作用:

  • 逻辑组织:将相关数据库对象分组管理
  • 命名空间:避免不同模块之间的对象命名冲突
  • 访问控制:通过模式级别的权限实现细粒度的安全管理
  • 多租户支持:利用模式隔离不同租户的数据