【.com速译】作为一名开发者,我总是尝试通过实验和构建来学习新技术。我最近对无服务器数据库产生了兴趣,这是一种有望加快部署速度、提高可扩展性和改善开发人员体验的技术。在测试了多种产品之后,我决定将我的个人网站从Firebase和Redis切换到PlanetScale,这是一个基于MySQL和Vitess构建的新型无服务器数据库平台,这是一个为YouTube提供支持而开发的开源平台。我选择PlanetScale的原因如下:数据库分支:我可以使用与Git相同的心智模型使用相同的数据库。每次更改数据库架构时,我都会打开一个部署请求。然后我可以将这些更改合并回主数据库分支。Prisma支持:结合Prisma,可以轻松处理数据库迁移。无连接:因为PlanetScale是无服务器的,它可以同时支持数千个连接。几乎可以将其视为无连接,因为我不需要担心池化或其他常见问题。不到10秒即可部署:在测试了13个数据库后,我发现PlanetScale是部署速度最快的。使用几周并监控性能后,我发现API的平均解析时间约为150毫秒(请参见下面的结果)。Firebase和Redis我的网站以前使用GoogleFirebase和Redis来获取实时博客文章浏览量和留言簿。决定选择这些技术的主要原因是为了学习。Firebase和Redis(带有Upstash)都很容易上手,无需考虑即可扩展,并且可以在无服务器环境中平稳运行。但是我想切换到基于SQL的数据库(MySQL或PostgreSQL)以获得新的学习体验。重建SQL我发现自己在编写JavaScript,其中SQL具有内置功能。比如说,我正在使用Firebase将读取计数作为JSON对象获取,然后将这些值相加以得出总读取计数。constsnapshot=awaitdb.ref('views').once('value');constviews=snapshot.val();installViews=Object.values(views).reduce((total,value)=>total+value);对于SQL,您可以改用SUM()。SELECTSUM(count)总计FROMviews;排序也是如此。以前我使用JavaScript排序,现在我使用ORDERBY。虽然Firebase确实有类似的东西,但我不使用它。SELECT*FROMguestbookORDERBYupdated_atDESC;SQL是一项成熟的技术。它已经存在多年,并将继续存在多年。我在之前的工作中使用过它,仍然觉得可以更深入地理解它。我也喜欢使用PostgreSQL(推荐Supabase),强烈建议考虑该解决方案。我也非常相信使用您推荐的工具。如果我没有实际编写代码并在生产环境中运行应用程序,就很难自信地向其他人推荐产品。我对PlanetScaleVercelIntegration的使用感到惊喜。只需点击几下鼠标,我就可以部署整个全栈应用程序。如开头所述,数据库迁移符合我的心智模型。迁移现有数据可能有更好的迁移方法,但我将数据迁移到PlanetScale的自制解决方案如下:ExportJSONdatafrommyFirebaseRealtimeDatabaseUsingHVALSandTablePlus,ExportJSONdatafrommyRedisclusteratCreateanewdatabasebranch在PlanetScale中进行模式迁移以添加表创建两个新的API路由,负责加载JSON数据和INSERTINTO(插入)MySQL验证API在数据库分支上正确处理和迁移数据创建一个新模式更改部署请求并合并它进入main最后,点击API并将JSON数据迁移到main完成!下面是我用来参考的两个脚本。importdbfrom'lib/planetscale';importguestbookDatafrom'data/guestbook';exportdefaultasyncfunctionhandler(req,res){consttoISOString=(unixTimestampInMs)=>newDate(unixTimestampInMs).toJSON().slice(0,19).replace('T','');letquery=`INSERTINTOguestbook(email,updated_at,body,created_by)VALUES`;constescapeStr=(str)=>str.replace(/\\/g,'\\\\').replace(/\$/g,'\\$').replace(/'/g,"\\'").replace(/"/g,'\\"');guestbookData.forEach((item,key)=>{varvalue=JSON.parse(item['value']);query+=`("${value.email?`${value.email}`:'not@provided.com'}","${toISOString(value.updated_at)}","${escapeStr(value.body)}","${value.created_by}")`;if(key===guestbookData.length-1){query+=';';}else{query+=',';}});const[rows]=awaitdb.query(query);returnres.status(201).json(rows[0]);}importdbfrom'lib/planetscale';importviewsDatafrom'data/views';exportdefaultasyncfunctionhandler(req,res){letquery=`INSERTINTOviews(slug,count)VALUES`;constslugs=Object.keys(viewsData['views']);slugs.forEach((slug,key)=>{constcount=viewsData['views'][slug];query+=`("${slug}",${count})`;if(key===slugs.length-1){query+=';';}else{query+=',';}});const[行]=awaitdb.query(query);returnres.status(201).json(rows[0]);}下面是我的PlanetScale架构,用于跟踪博客帖子阅读和留言簿评论CREATETABLE`views`(`slug`varchar(128)NOTNULL,`count`bigintNOTNULLDEFAULT'1',PRIMARYKEY(`slug`))CREATETABLE`guestbook`(`id`bigintNOTNULLAUTO_INCREMENT,`email`varchar(256)NOTNULL,`body`varchar(500)NOTNULL,`created_by`varchar(256)NOTNULL,`created_at`datetime(6)NOTNULLDEFAULTCURRENT_TIMESTAMP(6),`updated_at`datetime(6)NOTNULLDEFAULTCURRENT_TIMESTAMP(6),PRIMARYKEY(`id`))结果证明我一直在使用Checkly来监控PlanetScale级别的生产连接API性能。Checkly允许我设置中断或性能低于可接受阈值的警报。到目前为止,当我在美国东部的Vercel上部署为无服务器函数时,我的Next.jsAPI路由滞后了大约150毫秒。PlanetScale性能摘要如下图所示,与我之前的Firebase实施相比,响应时间明显更快(请注意我进行切换的时间)。此外,使用一项服务而不是两项服务可以清理代码,连接到每项服务所需的环境变量更少。原标题:HowtoMigratetoPlanetScale’sServerlessDatabase,作者:LeeRobinson
