Supabase:当开源遇上实时数据库服务

在当代应用开发的浪潮中,我们见证了无服务器架构和实时数据库服务的崛起。Firebase 的成功验证了这一方向,但同时也带来了供应商锁定的困扰。正是在这样的背景下,Supabase 横空出世,以开源的姿态为开发者提供了一个全新的选择。

为什么 Supabase 值得关注?

当我们谈论 Supabase 时,不能简单地将其定义为"开源版的 Firebase"。这种比较虽然直观,却可能掩盖了 Supabase 的独特价值。事实上,Supabase 代表了一种全新的思维方式:它证明了我们可以用开源组件构建一个功能完备的实时数据库服务,而不必依赖封闭的专有技术。

想象一下这样的场景:你正在开发一个实时协作的应用,需要处理实时数据同步、身份认证、文件存储等复杂需求。传统方案可能需要集成多个服务,而 Supabase 则提供了一个统一的解决方案,同时保持了开源的灵活性。

技术栈的明智选择

Supabase 的技术栈选择体现了深刻的工程智慧。它以 PostgreSQL 为核心,而不是重新发明一个数据库引擎。这个选择乍看平淡,实则高明:

-- Supabase 的实时功能建立在 PostgreSQL 的基础上
CREATE TABLE documents (id uuid DEFAULT uuid_generate_v4(),content text,last_modified timestamp DEFAULT now(),PRIMARY KEY (id)
);-- 启用实时功能只需要简单的配置
ALTER PUBLICATION supabase_realtime ADD TABLE documents;

这段简单的代码背后,体现了 Supabase 的几个关键优势:

  1. 站在巨人的肩膀上
    PostgreSQL 经过数十年的发展,已经是一个成熟且强大的数据库系统。Supabase 通过扩展而不是替换 PostgreSQL,继承了这份成熟度。

  2. 实时功能的优雅实现
    Supabase 通过 PostgreSQL 的 logical replication 功能实现实时更新,这是一个巧妙的设计决策。它避免了重复造轮子,同时确保了可靠性。

开发体验的革新

Supabase 对开发体验的重视令人印象深刻。看看这个实时订阅的例子:

const supabase = createClient('https://your-project.supabase.co','your-anon-key'
)// 实时订阅数据变化
const subscription = supabase.from('documents').on('*', payload => {console.log('Change received!', payload)}).subscribe()

这段代码看起来简单,但它展示了 Supabase 在开发体验上的几个重要创新:

  1. 声明式 API
    开发者不需要关心底层的 WebSocket 连接管理、重连逻辑等复杂细节。

  2. 类型安全
    如果你使用 TypeScript,Supabase 可以自动生成数据库表的类型定义,这在规模化开发中特别有价值。

身份认证:安全与便利的平衡

Supabase 的身份认证系统展示了如何在安全性和便利性之间取得平衡:

// 使用魔法链接进行无密码登录
const { user, error } = await supabase.auth.signInWithOtp({email: 'user@example.com'
})// Row Level Security 的简单配置
CREATE POLICY "Users can only access their own data"
ON documents
FOR ALL
USING (auth.uid() = user_id);

这个设计反映了现代应用开发的几个重要趋势:

  1. 无密码认证
    越来越多的应用选择使用魔法链接等无密码方案,Supabase 使这个过程变得简单。

  2. 细粒度访问控制
    通过 PostgreSQL 的 Row Level Security,Supabase 提供了强大而灵活的权限控制。

储存解决方案:超越简单的文件存储

Supabase 的存储解决方案建立在 S3 兼容的对象存储之上,但它的实现更加智能:

// 上传文件并自动生成缩略图
const { data, error } = await supabase.storage.from('images').upload('public/image.png', file, {transformations: [{name: 'thumbnail',width: 100,height: 100}]})

这个特性体现了 Supabase 的一个重要理念:提供高级功能,但保持 API 的简洁性。

实践中的考虑

在实际应用 Supabase 时,有几个关键点值得注意:

  1. 数据模型设计
    由于 Supabase 使用 PostgreSQL,我们可以充分利用关系数据库的优势,但同时需要注意实时功能对数据模型的影响。

  2. 扩展性考虑
    虽然 Supabase 提供了托管服务,但它的开源特性意味着我们可以在需要时完全控制部署和扩展。

未来展望

Supabase 的发展方向值得期待:

  1. Edge Functions
    边缘计算将为实时应用带来更低的延迟和更好的用户体验。

  2. AI 集成
    PostgreSQL 的向量搜索能力为 AI 应用提供了基础。

  3. 多区域部署
    对全球化应用的支持将进一步增强。

结语

Supabase 不仅仅是一个 Firebase 的开源替代品,它代表了一种新的应用开发范式。通过组合成熟的开源技术,它创造了一个强大而灵活的平台。对于现代应用开发者来说,Supabase 提供了一个值得认真考虑的选择。

在选择技术栈时,我们不应该被"开源版 Firebase"这样的标签所限制。相反,应该认真评估 Supabase 独特的优势:开源的灵活性、PostgreSQL 的成熟度、实时功能的优雅实现,以及不断发展的生态系统。在这个需要快速构建实时应用的时代,Supabase 为我们提供了一个强大而实用的工具。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/884263.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【华为HCIP实战课程二十九】中间到中间系统协议IS-IS邻居关系建立和LSP详解,网络工程师

一、广播环境邻居关系建立详解 1、广播环境邻居关系建立 广播邻居关系采用三次握手,携带的邻居列表为接口的MAC来标识 2、LSP同步:3种报文(CSNP和PSNP和具体的LSP) CSNP作用类似DBD,请求者发送PSNP(类似LSR)来请求具体的LSP 广播网络LSP交互过程: R1-R2(DIS)--R3…

<HarmonyOS第一课>应用/元服务上架的课后习题

善者,吾善之; 不善者,吾亦善之,德善。 信者,吾信之; 不信者,吾亦信之,德信。 圣人在天下,歙歙焉为天下浑其心,百姓皆注其耳目,圣人皆孩之。 通过&…

游戏引擎中Static,Kinematic,Dynamic三种刚体属性

一.刚体属性 为了提高物理检测效率和内存使用,引擎只对特殊标识的刚体属性进行检测。包括常用的RayCast检测,BoxCast检测,AABB包围盒检测。 Static:实际游戏中不可能发生移动的房子,树木,建筑物等。引擎初始化进行Collider刷新 Kinematic:实际游戏中奇特的物体,传送门,陷阱等, …

【系统架构设计师】预测试卷一:论文(包括4篇论文主题对应的写作要点分析)

更多内容请见: 备考系统架构设计师-专栏介绍和目录 文章目录 试题一:论面向服务的架构设计与应用试题一写作要点试题二:论软件架构的脆弱性试题二 写作要点试题三:论分布式存储系统架构设计试题三 写作要点试题四:论网络安全体系架构设计及应用试题四 写作要点试题一:论面…

【如何获取股票数据30】Python、Java等多种主流语言实例演示获取股票行情api接口之沪深A股炸板股池数据获取实例演示及接口API说明文档

最近一两年内,股票量化分析逐渐成为热门话题。而从事这一领域工作的第一步,就是获取全面且准确的股票数据。因为无论是实时交易数据、历史交易记录、财务数据还是基本面信息,这些数据都是我们进行量化分析时不可或缺的宝贵资源。我们的主要任…

SpringBoot实现国密通信

SpringBoot实现国密通信 1. 生成支持国密的证书1.1 安装 GMSSL(如果未安装)1.2 生成 SM2 密钥对和证书 2. 配置 Spring Boot 项目使用 HTTPS2.1 项目 B:提供 HTTPS 接口2.2 项目 A:使用 HTTPS 调用项目 B 3. 启动和测试备注如何验…

九识智能与徐工汽车达成战略合作,共绘商用车未来新蓝图

近日,九识智能与徐工汽车签署战略合作协议,标志着双方在智能驾驶技术与新能源商用车融合应用、联合生产及市场推广等方面迈入深度合作的新篇章,将共同引领智能驾驶技术商业化浪潮。 近年来,在国家智能化发展战略的引领下&#xff…

基于深度学习的社交网络中的社区检测

在社交网络分析中,社区检测是一项核心任务,旨在将网络中的节点(用户)划分为具有高内部连接密度且相对独立的子群。基于深度学习的社区检测方法,通过捕获复杂的网络结构信息和节点特征,在传统方法基础上实现…

根据Redis漏洞通知的整改修复过程

一、收到通知: 二、查看本校“宝山商城(教学)”已安装的Redis版本号 对照影响范围的版本号,在其内,所以需要升级Redis版本。 三、升级centos中的Redis版本 在Cent0S系统中,如果我们需要升级Redis版本&…

如何修改远程分支?修改了会影响什么?

要修改 Git 远程仓库中的分支名称&#xff0c;可以按照以下步骤操作&#xff1a; 首先&#xff0c;在本地仓库中重命名分支。使用以下命令将当前分支重命名为新名称&#xff1a; git branch -m <old-branch-name> <new-branch-name>例如&#xff0c;如果你想要将名…

12. 内存管理

一、内存的组织方式 程序员编写完程序之后&#xff0c;程序要先加载在计算机的内存中&#xff0c;再运行程序。在 C 中&#xff0c;不同数据在内存中所存储的位置也不一样。全局变量存储在内存中的静态存储区&#xff0c;非静态的局部变量存储在内存中的动态存储区&#xff08;…

docker 可用镜像服务地址(2024.10.31亲测可用)

1.错误 Error response from daemon: Get “https://registry-1.docker.io/v2/” 原因&#xff1a;镜像服务器地址不可用。 2.可用地址 编辑daemon.json&#xff1a; vi /etc/docker/daemon.json内容修改如下&#xff1a; {"registry-mirrors": ["https://…

Git (推送到远端仓库)

目录 一、在 gitee 上创建一个仓库 二、将项目推送到远程仓库 三、解释推送命令 一、在 gitee 上创建一个仓库 操作如下&#xff1a; 二、将项目推送到远程仓库 这里例举新的项目推送到远程仓库的例子&#xff1a; 打开仓库查看&#xff1a; 三、解释推送命令 添加远程仓库…

2025前端面试-性能优化(HTML与CSS)---003

1.什么是SEO 定义 &#xff1a;Serach Engine Optimization涉及到的使用&#xff1a; 门户网站或者功能网站&#xff08;搜索引擎展示的先后顺序&#xff0c;推广 如搜索pdf转化器搜索之后&#xff0c;同质化显示出来的内容先后会决定网站的点击量&#xff09; 2. SEO有哪些关…

自监督强化学习:对比预测编码(CPC)算法深度解析

自监督强化学习&#xff1a;对比预测编码&#xff08;CPC&#xff09;算法深度解析 引言 在人工智能领域&#xff0c;强化学习&#xff08;Reinforcement Learning, RL&#xff09;与自监督学习&#xff08;Self-Supervised Learning, SSL&#xff09;的结合正在引领一场革命…

opencv学习笔记(6):图像预处理(直方图、图像去噪)

3.直方图 直方图是用来表现图像中亮度分布的&#xff0c;给出的是图像中某个亮度或者某个范围亮度下共有几个像素&#xff0c;即统计一幅图某个亮度像素的数量。 直方图不能反映某一灰度值像素在图像中的位置&#xff0c;失去了图像的空间信息。图像直方图由于其计算代价较小&a…

C# 中 发送HTTP请求 实现Ajax功能

Ajax技术的核心及其在jQuery中的使用&#xff0c;包括GET和POST请求的实现&#xff0c;以及Ajax轮询请求的工作原理。通过实例展示了如何使用jQuery.Ajax进行HTTP请求&#xff0c;与后端接口交互&#xff0c;以及处理JSON数据。同时还提到了跨域问题和轮询请求中停止条件的设定…

使用socket库创建简单的客户端和服务器

以下是使用Python的socket库创建简单的客户端和服务器的示例。这个示例将展示如何建立一个基本的TCP连接&#xff0c;服务器接收数据并发送响应&#xff0c;客户端发送数据并接收响应。 服务器端代码 首先&#xff0c;我们编写服务器端代码&#xff0c;它将监听来自客户端的连…

《双指针篇》---移动零

题目传送门 这道题可以归类为 数组划分/数组分块 。 题目制定了一个规则&#xff0c;我们可以在这个规则下&#xff0c;将数组划分为若干个区间。 这道题让我们把所有非零元素移动到左边。所有零元素移动到右边。 将数组划分为&#xff1a; 左区间非0&#xff1b; 右区间&…

写一个小日历

以下是一个示例&#xff0c;展示了如何创建一个基本的日历 日历 1. HTML 结构 首先&#xff0c;创建一个基本的 HTML 结构&#xff0c;用于展示日历。 <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta na…