Supabase数据库概述 #
一、PostgreSQL基础 #
1.1 为什么选择PostgreSQL #
text
PostgreSQL优势
├── 40+年发展历史
├── ACID事务保证
├── 完整SQL标准支持
├── 丰富的数据类型
├── 强大的扩展生态
├── 活跃的社区支持
└── 企业级可靠性
1.2 Supabase中的PostgreSQL #
| 特性 | 说明 |
|---|---|
| 版本 | PostgreSQL 15+ |
| 扩展 | 内置pgvector、pgjwt等 |
| 连接 | 直连或连接池 |
| 备份 | 自动备份 |
| 监控 | 内置监控仪表板 |
1.3 数据库架构 #
text
Supabase数据库架构
├── public schema
│ ├── 用户表
│ ┴── 业务表
│
├── auth schema
│ ├── users (用户表)
│ ├── sessions (会话表)
│ ├── refresh_tokens
│ └── identities
│
├── storage schema
│ ├── buckets (存储桶)
│ ├── objects (文件对象)
│ └── migrations
│
└── extensions
├── pgvector (向量搜索)
├── pgjwt (JWT支持)
├── pg_cron (定时任务)
└── pg_net (HTTP请求)
二、表编辑器 #
2.1 打开表编辑器 #
text
Dashboard > Table Editor
功能
├── 可视化创建表
├── 编辑数据
├── 设置列属性
├── 添加外键关系
└── 设置RLS策略
2.2 创建表 #
text
点击 "Create a new table"
基本设置
├── 表名: 例如 users
├── 启用RLS: 建议开启
└── 添加列
列设置
├── 列名
├── 数据类型
├── 默认值
├── 是否可空
└── 是否主键
2.3 创建表示例 #
text
创建 users 表
| 列名 | 类型 | 默认值 | 可空 | 主键 |
|------|------|--------|------|------|
| id | int8 | 自动生成 | 否 | 是 |
| created_at | timestamptz | now() | 否 | 否 |
| name | text | - | 是 | 否 |
| email | text | - | 否 | 否 |
| avatar_url | text | - | 是 | 否 |
点击 "Save" 保存
2.4 编辑数据 #
text
表编辑器数据视图
├── 行内编辑: 双击单元格直接编辑
├── 添加行: 点击 "Insert row"
├── 删除行: 选中行后点击删除
├── 过滤: 使用过滤器筛选数据
└── 排序: 点击列头排序
三、SQL编辑器 #
3.1 打开SQL编辑器 #
text
Dashboard > SQL Editor
功能
├── 执行SQL语句
├── 保存查询
├── 查询历史
├── 格式化SQL
└── 导出结果
3.2 执行SQL #
sql
-- 创建表
CREATE TABLE posts (
id BIGSERIAL PRIMARY KEY,
title TEXT NOT NULL,
content TEXT,
author_id BIGINT REFERENCES users(id),
created_at TIMESTAMPTZ DEFAULT NOW(),
published BOOLEAN DEFAULT FALSE
);
-- 插入数据
INSERT INTO posts (title, content, author_id)
VALUES ('First Post', 'Hello World', 1);
-- 查询数据
SELECT * FROM posts;
-- 更新数据
UPDATE posts SET published = true WHERE id = 1;
-- 删除数据
DELETE FROM posts WHERE id = 1;
3.3 保存查询 #
text
SQL编辑器 > Save query
保存的查询可以:
├── 重复使用
├── 分享给团队成员
├── 组织到文件夹
└── 设置为快捷查询
3.4 快捷键 #
| 快捷键 | 功能 |
|---|---|
| Cmd/Ctrl + Enter | 执行查询 |
| Cmd/Ctrl + S | 保存查询 |
| Cmd/Ctrl + Shift + F | 格式化SQL |
| Cmd/Ctrl + / | 注释/取消注释 |
四、数据库连接 #
4.1 连接信息 #
text
Settings > Database
连接方式
├── 直连 (端口 5432)
│ └── 适合长连接、事务操作
│
└── 连接池 (端口 6543)
└── 适合Serverless、短连接
4.2 连接字符串 #
text
# 直连
postgresql://postgres.[project-ref]:[password]@aws-0-[region].pooler.supabase.com:5432/postgres
# 连接池
postgresql://postgres.[project-ref]:[password]@aws-0-[region].pooler.supabase.com:6543/postgres
4.3 使用客户端工具连接 #
bash
# 使用psql连接
psql "postgresql://postgres.[project-ref]:[password]@aws-0-[region].pooler.supabase.com:5432/postgres"
# 使用DBeaver、pgAdmin等GUI工具
# 填入连接信息即可
4.4 使用代码连接 #
typescript
import { createClient } from '@supabase/supabase-js'
import { Pool } from 'pg'
// 使用Supabase客户端
const supabase = createClient(url, key)
// 或使用原生PostgreSQL客户端
const pool = new Pool({
connectionString: 'postgresql://...',
})
五、Schema管理 #
5.1 默认Schema #
text
默认Schema
├── public - 用户数据
├── auth - 认证数据
├── storage - 存储元数据
├── _realtime - 实时订阅
└── extensions - 扩展数据
5.2 创建自定义Schema #
sql
-- 创建schema
CREATE SCHEMA app;
-- 在schema中创建表
CREATE TABLE app.settings (
id BIGSERIAL PRIMARY KEY,
key TEXT UNIQUE NOT NULL,
value JSONB
);
-- 查询时指定schema
SELECT * FROM app.settings;
5.3 Schema权限 #
sql
-- 授予schema使用权限
GRANT USAGE ON SCHEMA app TO authenticated;
-- 授予表操作权限
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA app TO authenticated;
六、扩展管理 #
6.1 内置扩展 #
text
Settings > Database > Extensions
常用扩展
├── pgvector - 向量存储和搜索
├── pgjwt - JWT处理
├── pg_cron - 定时任务
├── pg_net - HTTP请求
├── pg_stat_statements - 查询统计
├── uuid-ossp - UUID生成
├── postgis - 地理空间
└── pg_trgm - 文本相似度
6.2 启用扩展 #
sql
-- 启用扩展
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
CREATE EXTENSION IF NOT EXISTS "pgvector";
CREATE EXTENSION IF NOT EXISTS "pg_cron";
-- 查看已安装扩展
SELECT * FROM pg_extension;
6.3 使用扩展示例 #
sql
-- uuid-ossp: 生成UUID
SELECT uuid_generate_v4();
-- pgvector: 向量操作
CREATE TABLE embeddings (
id BIGSERIAL PRIMARY KEY,
content TEXT,
embedding vector(1536)
);
INSERT INTO embeddings (content, embedding)
VALUES ('Hello', '[0.1, 0.2, ...]'::vector);
-- 向量相似度搜索
SELECT content, 1 - (embedding <=> '[0.1, 0.2, ...]'::vector) as similarity
FROM embeddings
ORDER BY embedding <=> '[0.1, 0.2, ...]'::vector
LIMIT 5;
七、数据库函数 #
7.1 创建函数 #
sql
-- 创建简单函数
CREATE OR REPLACE FUNCTION get_user_count()
RETURNS BIGINT AS $$
BEGIN
RETURN (SELECT COUNT(*) FROM auth.users);
END;
$$ LANGUAGE plpgsql SECURITY DEFINER;
-- 调用函数
SELECT get_user_count();
7.2 带参数的函数 #
sql
CREATE OR REPLACE FUNCTION get_posts_by_user(user_id BIGINT)
RETURNS SETOF posts AS $$
BEGIN
RETURN QUERY SELECT * FROM posts WHERE author_id = user_id;
END;
$$ LANGUAGE plpgsql;
-- 调用
SELECT * FROM get_posts_by_user(1);
7.3 使用客户端调用函数 #
typescript
// 调用数据库函数
const { data, error } = await supabase.rpc('get_user_count')
// 带参数调用
const { data, error } = await supabase.rpc('get_posts_by_user', {
user_id: 1
})
八、数据库触发器 #
8.1 创建触发器 #
sql
-- 创建触发器函数
CREATE OR REPLACE FUNCTION handle_updated_at()
RETURNS TRIGGER AS $$
BEGIN
NEW.updated_at = NOW();
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
-- 创建触发器
CREATE TRIGGER on_users_update
BEFORE UPDATE ON users
FOR EACH ROW
EXECUTE FUNCTION handle_updated_at();
8.2 常用触发器场景 #
sql
-- 自动创建用户资料
CREATE OR REPLACE FUNCTION handle_new_user()
RETURNS TRIGGER AS $$
BEGIN
INSERT INTO public.profiles (id, email)
VALUES (NEW.id, NEW.email);
RETURN NEW;
END;
$$ LANGUAGE plpgsql SECURITY DEFINER;
CREATE TRIGGER on_auth_user_created
AFTER INSERT ON auth.users
FOR EACH ROW
EXECUTE FUNCTION handle_new_user();
九、数据库视图 #
9.1 创建视图 #
sql
-- 创建视图
CREATE VIEW active_users AS
SELECT id, email, created_at
FROM auth.users
WHERE last_sign_in_at > NOW() - INTERVAL '30 days';
-- 查询视图
SELECT * FROM active_users;
9.2 物化视图 #
sql
-- 创建物化视图
CREATE MATERIALIZED VIEW user_stats AS
SELECT
u.id,
u.email,
COUNT(p.id) as post_count
FROM auth.users u
LEFT JOIN posts p ON u.id = p.author_id
GROUP BY u.id, u.email;
-- 刷新物化视图
REFRESH MATERIALIZED VIEW user_stats;
十、性能优化 #
10.1 索引管理 #
sql
-- 创建索引
CREATE INDEX idx_posts_author ON posts(author_id);
CREATE INDEX idx_posts_created ON posts(created_at DESC);
-- 查看索引
SELECT * FROM pg_indexes WHERE tablename = 'posts';
-- 分析查询
EXPLAIN ANALYZE SELECT * FROM posts WHERE author_id = 1;
10.2 查询优化建议 #
text
优化建议
├── 为常用查询条件创建索引
├── 避免SELECT *
├── 使用LIMIT限制结果
├── 合理使用JOIN
└── 定期VACUUM
十一、总结 #
数据库操作要点:
| 操作 | 工具 |
|---|---|
| 创建表 | 表编辑器 / SQL |
| 编辑数据 | 表编辑器 |
| 复杂查询 | SQL编辑器 |
| 数据库管理 | SQL / 客户端工具 |
| 性能优化 | 索引 / 分析 |
下一步,让我们学习表操作!
最后更新:2026-03-28