PolarDB Supabase是PolarDB PostgreSQL版推出全託管的Supabase服務,以PolarDB PostgreSQL版為核心,整合了Realtime即時資料庫、RESTful API、GoTrue身份認證、檔案儲存體、日誌採集等關鍵功能,並在此基礎上進行了最佳化與增強,為您省去Supabase複雜的參數管理和應用營運等操作,並提供了兼具靈活性與高效能的後端解決方案。您可以基於PolarDB Supabase快速搭建Web、SaaS平台、AI整合應用等現代化應用。
接下來,將為您展示如何使用PolarDB Supabase快速搭建一個會議筆記系統。
核心功能
功能 | 說明 |
完整資料庫功能 | Supabase基於PolarDB PostgreSQL版資料庫構建,提供完整的資料庫功能:
|
即時訂閱(Realtime) | 基於PostgreSQL的邏輯複製,實現即時資料同步:
|
身份認證(Auth) | 內建完善的身份認證和授權系統:
|
行級安全(RLS) | 基於PostgreSQL的行級安全性原則:
|
儲存服務 | 基於PolarDB檔案系統進行檔案儲存體與管理:
|
邊緣函數(Edge Functions) | 基於Deno的伺服器端函數:
|
API(REST & GraphQL) | 自動產生的API介面:
|
搭建會議筆記系統
在會議筆記系統中,將主要應用以下功能:
功能 | 說明 |
資料存放區,主要記錄會議、筆記、任務、使用者狀態等表資訊。 | |
協作功能,用於即時同步筆記編輯、使用者線上狀態。 | |
資料安全,用於控制使用者存取權限。 | |
檔案管理,用於會議資料上傳和下載。 | |
使用者管理,用於系統管理使用者登入和會話管理。 |
應用技術棧
前端:Next.js 15 + React 18 + TypeScript。
後端:PolarDB Supabase (PostgreSQL + 鑒權 + 即時訂閱 + 儲存)。
UI:Tailwind CSS + Radix UI。
狀態管理:React Hooks + 本地狀態。
資料庫設計
為會議筆記系統的核心功能設計會議表、筆記表、使用者線上狀態表、標籤表及任務表等系統資料表,並通過外鍵約束以確保資料的一致性。
即時訂閱配置
啟用即時功能
-- 啟用即時訂閱功能
ALTER PUBLICATION supabase_realtime ADD TABLE meetings;
ALTER PUBLICATION supabase_realtime ADD TABLE notes;
ALTER PUBLICATION supabase_realtime ADD TABLE user_presence;
ALTER PUBLICATION supabase_realtime ADD TABLE tags;
ALTER PUBLICATION supabase_realtime ADD TABLE tasks;
ALTER PUBLICATION supabase_realtime ADD TABLE meeting_activities;
ALTER PUBLICATION supabase_realtime ADD TABLE meeting_files; 用戶端即時訂閱
// 建立自訂Hook管理即時訂閱
export function useRealtime(meetingId: string, callbacks: RealtimeCallbacks) {
const channelsRef = useRef<any[ ]>([ ])
const cleanup = useCallback(() => {
channelsRef.current.forEach((channel) => {
supabase.removeChannel(channel)
})
channelsRef.current = []
}, [])
useEffect(() => {
if (!meetingId) return
// 清理之前的串連
cleanup()
// 建立多個專用頻道
const presenceChannel = supabase
.channel(`presence:${meetingId}`)
.on(
"postgres_changes",
{
event: "*",
schema: "public",
table: "user_presence",
filter: `meeting_id=eq.${meetingId}`,
},
(payload) => {
console.log("User presence change:", payload)
if (callbacks.onUserPresenceChange) {
loadOnlineUsers()
}
},
)
.subscribe()
// 儲存頻道引用用於清理
channelsRef.current = [presenceChannel, /* 其他頻道 */]
}, [meetingId, callbacks])
return { cleanup }
}
即時訂閱設計指南
功能隔離:按業務情境劃分獨立頻道(如線上狀態、文檔協作、任務通知),避免邏輯耦合。
事件過濾:通過
filter參數限定事件範圍(如指定會議ID),減少冗餘資料轉送。資源回收:在組件卸載或頁面跳轉時,主動調用
removeChannel清理所有頻道串連,釋放資源。錯誤處理:監聽訂閱通道的狀態,對斷連、逾時等異常進行重試或降級處理。
安全性
行級安全(RLS)
-- 啟用RLS
ALTER TABLE meetings ENABLE ROW LEVEL SECURITY;
-- 建立安全性原則
CREATE POLICY "Users can view all meetings" ON meetings
FOR SELECT USING (true);
CREATE POLICY "Users can create meetings" ON meetings
FOR INSERT WITH CHECK (true);
CREATE POLICY "Users can update their own meetings" ON meetings
FOR UPDATE USING (auth.uid() = created_by);
使用者認證
const login = useCallback(async (email: string, password: string) => {
try {
const { data, error } = await supabase.auth.signInWithPassword({ email, password })
if (error) throw error
if (data.user) {
const userData = transformSupabaseUser(data.user)
setUser(userData)
localStorage.setItem("meeting_user", JSON.stringify(userData))
return { success: true, user: userData }
}
return { success: false, error: '登入失敗' }
} catch (error: any) {
return { success: false, error: error.message || '登入失敗' }
}
}, [])
const transformSupabaseUser = (supabaseUser: SupabaseUser): User => ({
id: supabaseUser.id,
email: supabaseUser.email || null,
name: supabaseUser.user_metadata?.name || supabaseUser.email?.split('@')[0] || '使用者',
avatar_url: supabaseUser.user_metadata?.avatar_url || null,
created_at: supabaseUser.created_at,
is_anonymous: supabaseUser.user_metadata?.is_anonymous || false,
})
用戶端整合
用戶端配置
// lib/supabase.ts
import { createClient } from '@supabase/supabase-js'
const supabaseUrl = process.env.NEXT_PUBLIC_SUPABASE_URL!
const supabaseAnonKey = process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!
export const supabase = createClient(supabaseUrl, supabaseAnonKey)
// 類型定義
export interface Meeting {
id: string
created_at: string
title: string
description: string | null
}環境變數管理
# 生產環境變數
NEXT_PUBLIC_SUPABASE_URL=<YOUR_SUPABASE_PUBLIC_URL>
NEXT_PUBLIC_SUPABASE_ANON_KEY=<YOUR_SUPABASE_ANON_KEY>快速搭建
下載專案範例程式碼:PolarDB-Supabase-App-Demo。
準備運行環境:專案範例程式碼需要在您的本地環境中安裝
Node.js和pnpm。說明Node.js:請前往Node.js官方網站進行下載和安裝。pnpm:在安裝Node.js後,可通過npm進行全域安裝,命令為npm install -g pnpm。
環境配置:在專案根目錄建立
.env.local檔案,並將以下值替換為您PolarDB Supabase的配置。說明您可在叢集的列表頁面,單擊您的應用ID進入應用詳情頁,在拓撲圖與配置頁簽中查看相關配置資訊。
<YOUR_SUPABASE_PUBLIC_URL>為應用的公網地址。<YOUR_SUPABASE_ANON_KEY>為應用參數secret.jwt.anonKey的值。
# 生產環境變數 NEXT_PUBLIC_SUPABASE_URL=<YOUR_SUPABASE_PUBLIC_URL> NEXT_PUBLIC_SUPABASE_ANON_KEY=<YOUR_SUPABASE_ANON_KEY>資料庫初始化:在專案根目錄的
scripts檔案夾下找到01-create-tables.sql檔案,並在Supabase Dashboard上面的右側導覽列SQL Editor中執行SQL。
運行專案:請在專案根目錄下執行以下命令以安裝依賴並啟動專案。啟動後,預設的本地訪問地址為
http://localhost:3000,您可以直接在瀏覽器中訪問該系統。pnpm install pnpm dev
經驗總結
基於上述會議筆記系統專案的實戰經驗,PolarDB Supabase最佳實務包括:
遵循這些最佳實務可以構建穩定、安全、高效能的PolarDB Supabase應用。