譯者 | 陳峻
策劃 | 云昭
如今,程序員們可以選用多種編程語(yǔ)言,來(lái)創(chuàng)建在線平臺(tái)、網(wǎng)站和應(yīng)用程序。其中,在編程社區(qū)中,廣受不同開(kāi)發(fā)背景的人員所推崇的一種流行語(yǔ)言,便是React Native。它是由Facebook的JavaScript工具包所構(gòu)建,適合為移動(dòng)平臺(tái)、而非Web,設(shè)計(jì)和創(chuàng)建獨(dú)特的用戶(hù)界面。目前,React Native已被廣泛地運(yùn)用在采用JavaScript的框架,并為iOS和Android平臺(tái)構(gòu)建移動(dòng)應(yīng)用的項(xiàng)目中。
可以說(shuō),該領(lǐng)域的開(kāi)發(fā)者不但需要了解JavaScript和API服務(wù)、而且要能夠構(gòu)建前端的UI,維護(hù)跨平臺(tái)的兼容性、以及整合基礎(chǔ)架構(gòu)與其他應(yīng)用。下圖展示了歷年來(lái),時(shí)下各種編程語(yǔ)言,在項(xiàng)目中被使用的占比分布。
目前,適合React Native應(yīng)用的數(shù)據(jù)庫(kù)有:Async Storage、SQLite、Realm、以及PouchDB等。下面,我將和大家一起深入討論各種數(shù)據(jù)庫(kù)的特性和優(yōu)缺點(diǎn),并最終給出為React Native應(yīng)用進(jìn)行選擇時(shí)的建議。
MMKV存儲(chǔ)
由C++開(kāi)發(fā)的MMKV存儲(chǔ)具有快速高效的特點(diǎn),可方便您在React Native應(yīng)用中快速地保存數(shù)據(jù)。同時(shí),該數(shù)據(jù)庫(kù)非常輕巧。它在Android上僅占50K空間,而在iOS上只有30K。如果被打包的話,其體積會(huì)更小。此外,MMKV不但支持redux-persist(持久化),而且允許用戶(hù)保存任何形式(無(wú)論是否加密)的數(shù)據(jù)。
特征如下:
- 支持加密(安全存儲(chǔ))。
- 支持多實(shí)例(將用戶(hù)數(shù)據(jù)與全局?jǐn)?shù)據(jù)分開(kāi))。
- 自定義存儲(chǔ)位置。
- 由于一切都是用C++編寫(xiě)的,因此具有高性能。
- 比Async Storage快大約30倍。
- 使用JSI框架,而不是舊的“橋”模式。
- 支持iOS、Android和Web。
- 易于使用React Hooks的API。
Realm數(shù)據(jù)庫(kù)
由于可以使用動(dòng)態(tài)映射到完整且專(zhuān)有的數(shù)據(jù)庫(kù)引擎,基于SQLite的Realm能夠處理各種原生的JavaScript對(duì)象,并在保持性能的同時(shí),提供一套簡(jiǎn)單的API。同時(shí),Realm允許開(kāi)發(fā)者創(chuàng)建各種高級(jí)搜索、復(fù)雜的數(shù)據(jù)表示、以及在圖表中的事物鏈接。
Realm在Android中屬于輕量級(jí)數(shù)據(jù)庫(kù)。與下文將討論的SQLite相比,Realm不但使用的內(nèi)存更少,而且在讀寫(xiě)數(shù)據(jù)等常見(jiàn)操作上的速度更快。此外,它還具有極其豐富的功能集。
特征如下:
- 由于Realm屬于對(duì)象存儲(chǔ),因此對(duì)象之間的關(guān)系可以通過(guò)各種“鏈接”來(lái)實(shí)現(xiàn)。
- 每個(gè)“鏈接”都能夠創(chuàng)建一個(gè)與鏈接到當(dāng)前對(duì)象的“反向鏈接”映射。
- Realm可以更新其實(shí)例版本。
- Realm帶有零拷貝(zero-copy)架構(gòu),以及延遲加載(lazy-loaded)式的數(shù)據(jù)訪問(wèn)。
SQLite
作為C語(yǔ)言數(shù)據(jù)存儲(chǔ)庫(kù)的SQLite,在移動(dòng)應(yīng)用程序中,特別適用于離線應(yīng)用。許多平臺(tái)都以簡(jiǎn)便的設(shè)置方式,提供了開(kāi)箱即用的SQLite支持。而作為最著名的免費(fèi)Android開(kāi)發(fā)數(shù)據(jù)庫(kù)之一,它不但具有開(kāi)源的顯著特點(diǎn),而且可以滿(mǎn)足開(kāi)發(fā)人員廣泛的項(xiàng)目需求。
特征
- 能夠在iOS和Android上提供相同JavaScript API。
- 在各種Java和Native模式下,以及Android中都可以被使用。
- 其簡(jiǎn)單的回調(diào)(callback)和Promises可以被用于連接JavaScript里的SQL事務(wù)。
- 可以從應(yīng)用程序包和沙箱中,導(dǎo)入預(yù)填充的SQLite數(shù)據(jù)庫(kù)。
- Windows能夠像在iOS和Android上一樣,支持回調(diào)API。
Firebase
Firebase實(shí)時(shí)數(shù)據(jù)庫(kù)是一個(gè)由Google支持的應(yīng)用開(kāi)發(fā)平臺(tái),可允許開(kāi)發(fā)人員為iOS、Android和web創(chuàng)建各種應(yīng)用。而作為一種基于云端的NoSQL數(shù)據(jù)庫(kù),F(xiàn)irebase可以通過(guò)提供分析跟蹤、報(bào)告、應(yīng)用問(wèn)題修復(fù)、以及市場(chǎng)和產(chǎn)品實(shí)驗(yàn)功能(experimentation capabilities)等服務(wù),在用戶(hù)之間實(shí)現(xiàn)實(shí)時(shí)存儲(chǔ)和數(shù)據(jù)同步。
特征
- 即使應(yīng)用處于離線狀態(tài),數(shù)據(jù)也能在所有客戶(hù)端之間實(shí)時(shí)同步。
- 可以讓開(kāi)發(fā)人員更專(zhuān)注于打造出色的用戶(hù)體驗(yàn),而無(wú)需管理服務(wù)器。
- Firebase為您準(zhǔn)備好了通用的服務(wù)器、API和數(shù)據(jù)存儲(chǔ),您只需按照實(shí)際需求進(jìn)行修改即可,而不需重新編寫(xiě)。
- 按照云托管數(shù)據(jù)庫(kù)的需求,F(xiàn)irebase可以將數(shù)據(jù)以JSON格式進(jìn)行存儲(chǔ),并進(jìn)一步持續(xù)同步到每個(gè)關(guān)聯(lián)的客戶(hù)端上。
- 作為基于云服務(wù)的數(shù)據(jù)庫(kù),它可被用于管理應(yīng)用程序的數(shù)據(jù),并提供快速的數(shù)據(jù)結(jié)果。
WatermelonDB
在React Native和React的在線項(xiàng)目中,WatermelonDB提供了一種管理用戶(hù)數(shù)據(jù)的新方法。它是專(zhuān)為創(chuàng)建復(fù)雜的React Native應(yīng)用而設(shè)計(jì)的,且十分重視應(yīng)用的實(shí)際性能。簡(jiǎn)單而言,由于Watermelon的架構(gòu)與數(shù)據(jù)庫(kù)無(wú)關(guān),因此開(kāi)發(fā)者可以橫跨多個(gè)平臺(tái)使用它,并能達(dá)到快速啟動(dòng)軟件的效果。此外,作為一個(gè)高級(jí)數(shù)據(jù)管理層,Watermelon還可以根據(jù)平臺(tái)的要求,連接到任何React原生的數(shù)據(jù)庫(kù)層面上。
特征
- 由于使用延遲加載,Watermelon DB可以只在被請(qǐng)求時(shí)才加載數(shù)據(jù)。據(jù)此,應(yīng)用程序的可擴(kuò)展性可以得到大幅增強(qiáng)。
- 由于所有的查詢(xún)都是在其不同的線程上完成的,因此大多數(shù)查詢(xún)只需不到1毫秒的時(shí)間。
- 無(wú)論后端的數(shù)據(jù)體量有多大,您都可以立即啟動(dòng)應(yīng)用程序。
- 它能夠與iOS、Android和web相兼容。
- 它使用JavaScript的靜態(tài)類(lèi)型檢查器,通過(guò)Flow的方式進(jìn)行靜態(tài)類(lèi)型轉(zhuǎn)化。
- 它具有快速、異步、多線程和高度緩存等特性,也可與同步引擎協(xié)同工作,以保持原生本地?cái)?shù)據(jù)庫(kù)與遠(yuǎn)程數(shù)據(jù)庫(kù)的同步。
PouchDB
PouchDB是一個(gè)基于Apache CouchDB的開(kāi)源JavaScript類(lèi)型的數(shù)據(jù)庫(kù)。它針對(duì)在瀏覽器中的各種使用場(chǎng)景進(jìn)行了優(yōu)化。PouchDB在瀏覽器中會(huì)使用IndexedDB和WebSQL在本地存儲(chǔ)數(shù)據(jù),并且持續(xù)實(shí)現(xiàn)本地和遠(yuǎn)程數(shù)據(jù)庫(kù)的交互。據(jù)此,PouchDB可以幫助Web開(kāi)發(fā)人員創(chuàng)建具有離線和在線等效功能的應(yīng)用。也就是說(shuō),它允許應(yīng)用在離線時(shí),將數(shù)據(jù)保存在本地,而在應(yīng)用重新上線后,再與CouchDB和其他兼容的服務(wù)器相同步,以確保用戶(hù)的數(shù)據(jù)始終為最新。
特征
- 由于PouchDB提供的API在所有瀏覽器中都是相同的,因此它可以在各種瀏覽器中被流暢地使用。
- 如果您對(duì)編程語(yǔ)言有所了解,那么學(xué)習(xí)和理解PouchDB并非難事。
- 作為一種輕量級(jí)的API,我們可以方便地使用script標(biāo)簽來(lái)包含它。
Vasern
Vasern是一種基于鏈接一致性的鍵-值存儲(chǔ)式React Native數(shù)據(jù)存儲(chǔ)系統(tǒng)。其目標(biāo)是提供一個(gè)開(kāi)源、且對(duì)開(kāi)發(fā)人員友好的端到端數(shù)據(jù)庫(kù)系統(tǒng)。而且,由于其數(shù)據(jù)引擎是從頭開(kāi)始創(chuàng)建的,因此Vasern提供了原生的性能。
特征
- 它通過(guò)UTF-8編碼來(lái)支持各種語(yǔ)言。
- 能夠支持字符串、整數(shù)、雙精度、日期時(shí)間、以及引用等基本數(shù)據(jù)類(lèi)型。
- 可以通過(guò)schema來(lái)創(chuàng)建、更新、查詢(xún)和刪除各種記錄。
MySQL、MongoDB和DynamoDB
一些小型組織往往會(huì)使用MySQL、MongoDB和DynamoDB等服務(wù)器端數(shù)據(jù)庫(kù),進(jìn)行React Native的應(yīng)用開(kāi)發(fā)。三者的比較如下:
開(kāi)發(fā)人員在選擇數(shù)據(jù)庫(kù)之前需要考慮什么?
眾所周知,在中小型軟件運(yùn)行的過(guò)程時(shí),數(shù)據(jù)往往是被保存在變量之中的。不過(guò),當(dāng)程序重啟時(shí),變量則會(huì)因?yàn)榛謴?fù)初始值,而導(dǎo)致數(shù)據(jù)的丟失。對(duì)此,我們需要數(shù)據(jù)庫(kù)在能夠起到很好的數(shù)據(jù)存儲(chǔ)、保持、以及在程序重啟后的持續(xù)檢索等作用。通常,我們可以在為React Native應(yīng)用選擇數(shù)據(jù)庫(kù)之前,考慮如下方面:
- 應(yīng)確保數(shù)據(jù)庫(kù)具有足夠的內(nèi)存,可供軟件的執(zhí)行。
- 選擇可以處理復(fù)雜數(shù)據(jù)結(jié)構(gòu)(如整篇文檔或?qū)ο螅┑臄?shù)據(jù)庫(kù)。
- 當(dāng)用戶(hù)從離線恢復(fù)為在線狀態(tài)時(shí),應(yīng)能夠通過(guò)集成來(lái)實(shí)現(xiàn)數(shù)據(jù)庫(kù)中數(shù)據(jù)的同步。
- 容易實(shí)現(xiàn)應(yīng)用與數(shù)據(jù)庫(kù)的集成。
小結(jié)
上述介紹的各種數(shù)據(jù)庫(kù)分別有著自己的一組特性和優(yōu)缺點(diǎn)。因此,在為React Native應(yīng)用選擇合適的數(shù)據(jù)庫(kù)時(shí),開(kāi)發(fā)人員應(yīng)當(dāng)清楚地了解自己的項(xiàng)目目標(biāo)和應(yīng)用需求,通過(guò)試用、比較和深入研究,從中選擇最符合要求的數(shù)據(jù)庫(kù)。
原文鏈接:https://dzone.com/articles/how-developers-need-to-choose-the-right-database-f
譯者介紹
陳峻 (Julian Chen),51CTO社區(qū)編輯,具有十多年的IT項(xiàng)目實(shí)施經(jīng)驗(yàn),善于對(duì)內(nèi)外部資源與風(fēng)險(xiǎn)實(shí)施管控,專(zhuān)注傳播網(wǎng)絡(luò)與信息安全知識(shí)與經(jīng)驗(yàn);持續(xù)以博文、專(zhuān)題和譯文等形式,分享前沿技術(shù)與新知;經(jīng)常以線上、線下等方式,開(kāi)展信息安全類(lèi)培訓(xùn)與授課。