優(yōu)秀數(shù)據(jù)庫(kù)模式遷移工具的發(fā)展歷程
譯文譯者 | 李睿
審校 | 重樓
數(shù)據(jù)庫(kù)模式遷移可能是應(yīng)用程序開(kāi)發(fā)中風(fēng)險(xiǎn)最大的領(lǐng)域——因?yàn)檫@是一個(gè)困難的、有風(fēng)險(xiǎn)的和痛苦的過(guò)程。數(shù)據(jù)庫(kù)模式遷移工具的存在是為了減輕這種痛苦,并且已經(jīng)取得了長(zhǎng)足的進(jìn)步:從基本的CLI工具到GUI工具,從簡(jiǎn)單的SQL GUI客戶端到一體化協(xié)作數(shù)據(jù)庫(kù)平臺(tái)。
命令行客戶端(CLI) - MySQL/PSQL
MySQL和PSQL分別是MySQL和PostgreSQL的本地CLI,可以從命令行直接向MySQL或PostgreSQL服務(wù)器發(fā)送命令或查詢。
盡管CLI界面很簡(jiǎn)單,但有時(shí)它會(huì)讓初學(xué)者望而生畏。然而,根據(jù)Timescale公司的2022年P(guān)ostgreSQL狀態(tài)調(diào)查結(jié)果,PSQL是最受歡迎的與PostgreSQL交互的工具,超過(guò)了pgAdmin和DBeaver等GUI工具。
GUI
1.PHPMyAdmin和PGAdmin
PHPMyAdmin和PGAdmin是經(jīng)典的SQL客戶端。PHPMyAdmin已經(jīng)是一個(gè)管理MySQL和MySQL兼容數(shù)據(jù)庫(kù)(例如MariaDB)的工具,而PGAdmin是PostgreSQL的對(duì)應(yīng)工具,現(xiàn)在已經(jīng)發(fā)展到PGAdmin 4。與CLI工具相比,PHPMyAdmin和PGAdmin提供了一個(gè)用于運(yùn)行和執(zhí)行SQL查詢的用戶界面(UI),使它們更加友好。
2.DBeaver
DBeaver的最初版本發(fā)布于2010年,這款開(kāi)源SQL客戶端支持各種數(shù)據(jù)庫(kù)(SQL、NoSQL和云數(shù)據(jù)庫(kù)),并通過(guò)整合OpenAI公司的GPT功能跟上人工智能領(lǐng)域的最新趨勢(shì),允許將自然語(yǔ)言轉(zhuǎn)換為SQL。
3.Navicat
Navicat于2001年首次發(fā)布。它當(dāng)時(shí)只支持MySQL,但后來(lái)增加了更多的數(shù)據(jù)庫(kù)。雖然Navicat的UI看起來(lái)有點(diǎn)過(guò)時(shí),但它具有完整的功能,并且在操作數(shù)據(jù)庫(kù)時(shí)提供了流暢的整體體驗(yàn)。
基于GUI的SQL客戶端是對(duì)基于CLI的SQL客戶端的良好補(bǔ)充。從根本上講,它們的工作方式是一樣的。用戶可以快速方便連接到數(shù)據(jù)庫(kù)并執(zhí)行一些SQL。另一方面,在數(shù)據(jù)庫(kù)更改管理和數(shù)據(jù)安全方面缺乏控制。本文將以Navicat為例進(jìn)行詳細(xì)介紹。
Gitops /數(shù)據(jù)庫(kù)即代碼
為了更好地管理和控制數(shù)據(jù)庫(kù)模式更改,一些工具在數(shù)據(jù)庫(kù)更改中引入了代碼更改過(guò)程,稱為數(shù)據(jù)庫(kù)即代碼(Database-as-Code)。
1.Liquibase
Liquibase創(chuàng)建于2006年,是一個(gè)用于跟蹤、管理和應(yīng)用數(shù)據(jù)庫(kù)更改的開(kāi)源庫(kù)。一個(gè)有趣的事實(shí)是:Liquibase于2012年被一家名為Datical的公司收購(gòu),并更名為Datica,但隨后于2020年更名為L(zhǎng)iquibase(這是明智之舉,見(jiàn)過(guò)有人在論壇上提到過(guò)Datica嗎?)。
Liquibase的主要產(chǎn)品是基于Java的CLI,它允許開(kāi)發(fā)團(tuán)隊(duì)通過(guò)CLI將數(shù)據(jù)庫(kù)模式遷移集成到他們的CI/CD工作流中。
2.Flyway
Flyway與Liquibase在很多方面有相似之處:它們都是成立時(shí)間較長(zhǎng)的數(shù)據(jù)庫(kù),擁有客戶群,而且都是開(kāi)源項(xiàng)目。它的核心產(chǎn)品是CLI和Java庫(kù)。
Flyway背后的商業(yè)實(shí)體是Redgate(于2019年被收購(gòu))。它有3個(gè)版本:社區(qū)、團(tuán)隊(duì)和企業(yè)。可以看出,他們?cè)陂_(kāi)源和商業(yè)產(chǎn)品之間劃出了一條清晰的界限:Flyway的網(wǎng)站總體上感覺(jué)更隨意,而Redgate的方式更專業(yè)。
Liquibase和Flyway并駕齊驅(qū)。兩者的主要區(qū)別在于各自的定位:Liquibase更面向企業(yè),而Flyway更面向開(kāi)發(fā)者。
3.Sqitch
Sqitch是一個(gè)純開(kāi)源項(xiàng)目,自從2012年以來(lái)一直沒(méi)有商業(yè)產(chǎn)品上市。它是純粹的CLI,沒(méi)有UI。
與基于Java的Liquibase和Flyway不同,Sqitch是使用Perl開(kāi)發(fā)的。此外,Sqitch在如何管理數(shù)據(jù)庫(kù)模式更改方面有自己的理念:Liquibase和Flyway都使用文件命名約定來(lái)安排模式遷移(約定高于配置)。
而Sqitch采用了一種顯式的方法,允許用戶在Sqitch計(jì)劃中指定順序。
4.Atlas
Atlas是一個(gè)由Ariga構(gòu)建的開(kāi)源工具,并推廣了“數(shù)據(jù)庫(kù)模式即代碼”這一術(shù)語(yǔ)。
可以看出,他們從HashiCorp那里獲得了很多靈感,并在首次出現(xiàn)在Hacker News上時(shí)將自己稱為“數(shù)據(jù)庫(kù)遷移的Terraform”。他們還發(fā)明了基于HCL (HashiCorp配置語(yǔ)言)的Atlas HCL。
Atlas使用現(xiàn)代編程語(yǔ)言Go(與使用Java的Liquibase/Fireway不同),并以CLI為中心(類似于Liquibase.Fireay/Sqitch),但它也有一個(gè)輕量級(jí)的UI。Atlas Cloud是一個(gè)開(kāi)源版本的商業(yè)產(chǎn)品。
一體化:GUI + Gitops / Database-As-Code + Collaboration
1.Prisma
像Prisma這樣的ORM針對(duì)的是代碼如何與數(shù)據(jù)交互的領(lǐng)域。雖然這更多的是一個(gè)后端主題,但Prisma是一個(gè)具有前端根的ORM。前端工程師可能不是最精通SQL的。為了降低管理數(shù)據(jù)庫(kù)模式的障礙,Prisma發(fā)明了它的DSL來(lái)定義數(shù)據(jù)模型。
DSL是基于狀態(tài)的(聲明性的),它描述了數(shù)據(jù)庫(kù)模式的最終狀態(tài),而不是增量變化,這與Liquibase/Flyway/Sqitch不同。通過(guò)這種方式,Prisma可以在整個(gè)應(yīng)用程序開(kāi)發(fā)周期中提供更全面的數(shù)據(jù)庫(kù)管理視圖。
Prisma ORM是開(kāi)源的,可以免費(fèi)使用,他們的數(shù)據(jù)平臺(tái)提供了一個(gè)基于云的協(xié)作平臺(tái),具有一些高級(jí)功能(很明顯,他們的目標(biāo)不僅僅是一個(gè)ORM和模式遷移工具)。
2.Bytebase
Bytebase是一個(gè)開(kāi)源數(shù)據(jù)庫(kù)DevOps工具,涵蓋了數(shù)據(jù)庫(kù)管理場(chǎng)景,從變更、查詢、安全性到基于Web的可視化協(xié)作工作區(qū)的治理。
Bytebase提供了一個(gè)基于Web的UI,開(kāi)發(fā)人員和DBA可以通過(guò)同一個(gè)界面協(xié)作處理數(shù)據(jù)庫(kù)更改。
3.數(shù)據(jù)庫(kù)即代碼(Database-As-Code)
為了更好地適應(yīng)開(kāi)發(fā)人員的工作習(xí)慣,Bytebase已經(jīng)將功能集成到代碼庫(kù)中,例如itLab和GitHub。通過(guò)啟用GitOps工作流,開(kāi)發(fā)人員可以將數(shù)據(jù)庫(kù)更改文件提交到熟悉的代碼存儲(chǔ)庫(kù),一旦審查完成并提交到repo, Bytebase將自動(dòng)觸發(fā)部署。無(wú)需在多個(gè)工具之間切換。
4.團(tuán)隊(duì)協(xié)作與管理
用戶可以為兩個(gè)級(jí)別的成員定義不同的角色:工作區(qū)和項(xiàng)目。可以為團(tuán)隊(duì)成員分配不同的角色,以便他們對(duì)不同的項(xiàng)目具有不同的權(quán)限;或者為每個(gè)項(xiàng)目配置審批工作流,例如指定負(fù)責(zé)此特定項(xiàng)目的特定DBA或QA。
Prisma和Bytebase的區(qū)別在于目標(biāo)受眾。Prisma主要針對(duì)前端/全棧開(kāi)發(fā)人員,而B(niǎo)ytebase更專注于后端和DBA。這兩款產(chǎn)品都提供協(xié)作功能,Prisma專注于單個(gè)項(xiàng)目中開(kāi)發(fā)人員之間的協(xié)作,而B(niǎo)ytebase針對(duì)整個(gè)工程組織,即開(kāi)發(fā)人員和DBA/平臺(tái)工程/運(yùn)營(yíng)團(tuán)隊(duì)。
結(jié)語(yǔ)
如果用戶以個(gè)人身份操作數(shù)據(jù)庫(kù),那么傳統(tǒng)的CLI或GUI SQL客戶端(如Navicat)就足夠了。如果更喜歡與代碼庫(kù)集成,有像Liquebase和Flyway這樣的解決方案。然而,對(duì)于類似Jira或GitLab的GUI和項(xiàng)目協(xié)作功能,可以選擇Prisma和Bytebase。Bytebase是唯一一個(gè)提供組織范圍管理功能的工具,除了使數(shù)據(jù)庫(kù)更改更高效和更安全之外,還可以確保數(shù)據(jù)安全和治理。
原文標(biāo)題:Evolution of Top Database Schema Change Tools,作者:Mila Wu