PostgreSQL一些概念特性

一、Schema(模式)

什么是 Schema?

在 PostgreSQL 中,Schema 是数据库对象(如表、视图、函数等)的逻辑容器,类似于命名空间 的概念。默认情况下,每个数据库包含一个名为 public 的 Schema。

Schema 的作用

  • 避免命名冲突:不同团队或模块可以使用相同的表名而互不影响。
  • 实现逻辑隔离:支持多租户或多模块架构。
  • 权限控制更细粒度:可以针对不同 Schema 授权。

常见操作

查看当前数据库中的所有 schema 及其所有者

sql 复制代码
SELECT schema_name, schema_owner
FROM information_schema.schemata

创建 Schema

sql 复制代码
-- 创建 Schema
CREATE SCHEMA my_app_schema;
-- 创建 schema 并指定所有者为 postgres
CREATE SCHEMA AUTHORIZATION postgres;

在指定 Schema 中创建表

sql 复制代码
CREATE TABLE my_app_schema.users
(
    id         SERIAL,
    name       VARCHAR(50),
    created_at TIMESTAMP DEFAULT now()
);

指定搜索路径(search_path)

sql 复制代码
-- 查看当前搜索路径
SHOW search_path; -- 默认通常是 "$user", public

-- 设置搜索路径(仅在当前会话生效)
SET search_path TO my_app_schema, public;

-- 为用户永久设置搜索路径
ALTER USER postgres SET search_path TO my_app_schema, public;

如果不指定 Schema,对象会默认创建在 public Schema 中。

二、Template

当你执行 CREATE DATABASE 时,PostgreSQL 并非从零开始。它实际上是克隆一个现有的模板数据库。

内置模板

  • template1:默认的模板数据库。你可以在此数据库中创建一些所有新数据库都需要的基础对象(如扩展、函数),后续创建的数据库都会包含它们。
  • template0:一个最原始的"干净"模板。永远不要修改它。当 template1 损坏或你需要一个不受自定义更改影响的纯净数据库时,就用它来创建。

操作示例

基于模板创建数据库

sql 复制代码
-- 默认使用 template1
CREATE DATABASE my_new_db;

-- 显式指定使用 template0
CREATE DATABASE my_clean_db TEMPLATE template0;

将现有数据库设为模板

sql 复制代码
-- 标记为模板(防止被意外连接)
UPDATE pg_database SET datistemplate = TRUE WHERE datname = 'db_template';

-- 现在可以基于它创建新数据库了
CREATE DATABASE app_dev WITH TEMPLATE db_template;

三、权限(Privileges)

PostgreSQL 提供基于角色(Role)的权限系统,支持对数据库、Schema、表、列等层级授权。

  • 用户(User):可登录数据库的角色;
  • 角色(Role):可被授予权限,但不一定能登录。

常见操作

创建角色、用户

sql 复制代码
CREATE ROLE read_only_role; -- 组角色
CREATE USER app_user WITH PASSWORD 'abc12345'; -- 登录用户

授予权限

sql 复制代码
-- 授予连接数据库权限
GRANT CONNECT ON DATABASE postgres TO read_only_role;

-- Schema 级别:使用和查看对象权限
GRANT USAGE ON SCHEMA my_app_schema TO read_only_role;
GRANT SELECT ON ALL TABLES IN SCHEMA my_app_schema TO read_only_role;

-- 对象级别:表的具体操作权限
GRANT SELECT, INSERT, UPDATE ON my_app_schema.users TO app_user;

-- 将角色授予用户(使用户拥有角色的所有权限)
GRANT read_only_role TO app_user;

权限类型

常见的权限包括:

权限 说明
CONNECT 连接数据库
CREATE 创建对象
SELECT / INSERT / UPDATE / DELETE 数据操作权限
USAGE 对 Schema 或序列的使用权限
EXECUTE 执行函数权限

四、插件(Extensions)

PostgreSQL 的扩展机制是其最大优势之一。通过插件(Extension),用户可以添加数据类型、函数、索引方法甚至外部数据源支持。

查看已安装插件

sql 复制代码
SELECT * FROM pg_extension;

安装可用插件

首先,确保插件包在服务器上已安装

sql 复制代码
-- 启用 PostGIS(地理信息系统)
CREATE EXTENSION IF NOT EXISTS postgis;

-- 启用 uuid-ossp 以生成 UUID
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

卸载插件

sql 复制代码
DROP EXTENSION postgis;

常见的一些插件

插件名 功能说明
hstore 键值存储类型
uuid-ossp UUID 生成函数
postgis 地理空间数据支持
pg_stat_statements SQL 性能分析
citext 大小写不敏感文本类型
dblink 跨库访问
pgcrypto 加密支持
相关推荐
小陈工1 小时前
Python Web开发入门(十七):Vue.js与Python后端集成——让前后端真正“握手言和“
开发语言·前端·javascript·数据库·vue.js·人工智能·python
科技小花6 小时前
数据治理平台架构演进观察:AI原生设计如何重构企业数据管理范式
数据库·重构·架构·数据治理·ai-native·ai原生
一江寒逸6 小时前
零基础从入门到精通MySQL(中篇):进阶篇——吃透多表查询、事务核心与高级特性,搞定复杂业务SQL
数据库·sql·mysql
D4c-lovetrain6 小时前
linux个人心得22 (mysql)
数据库·mysql
阿里小阿希6 小时前
CentOS7 PostgreSQL 9.2 升级到 15 完整教程
数据库·postgresql
荒川之神6 小时前
Oracle 数据仓库雪花模型设计(完整实战方案)
数据库·数据仓库·oracle
做个文艺程序员6 小时前
MySQL安全加固十大硬核操作
数据库·mysql·安全
不吃香菜学java7 小时前
Redis简单应用
数据库·spring boot·tomcat·maven
一个天蝎座 白勺 程序猿7 小时前
Apache IoTDB(15):IoTDB查询写回(INTO子句)深度解析——从语法到实战的ETL全链路指南
数据库·apache·etl·iotdb
不知名的老吴7 小时前
Redis的延迟瓶颈:TCP栈开销无法避免
数据库·redis·缓存