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 (...);小结
模式的核心作用:
- 逻辑组织:将相关数据库对象分组管理
- 命名空间:避免不同模块之间的对象命名冲突
- 访问控制:通过模式级别的权限实现细粒度的安全管理
- 多租户支持:利用模式隔离不同租户的数据