Firestore 是 Google 提供的一款雲端全代管無伺服器的 Document NoSQL 資料庫,scale out 取向的設計會自動多區域資料複製 replication ,也有強一致性 query 和 transaction 支援。對應其他的雲端服務是 :

  • Amazon Web Services (AWS) : DocumentDB
  • Microsoft Azure : Cosmos DB

Firestore 特別的一點是有提供 realtime listeners 即時監聽器來同步 Firestore 資料庫和 client apps 之間的資料,同時也有提供 offline support 離線支援,也就是說一旦雲端的 Firestore 有異動,資料便會自動同步到用戶端上 ; 另一方面當用戶端無法上網時會先存取資料在自己用戶端上,等到可以上網之後會跟雲端的 Firestore 資料庫互相同步。


歷史

在查詢 Firestore 相關資料或教學時,會發現很多名詞例如:「 Firebase 」、「 Realtime Database 」、「 Datastore」等等經常出現,那這些是什麼呢?有什麼關係呢? 以下來簡單說明一下:

  • Firebase 和 Firestore 的關係

    Firebase 原本是一間獨立的公司,提供 mobile application 平台服務 BaaS (Backend as a Service),支援很多手機開發的應用,而當時 Firebase 平台服務的資料庫是「 Realtime Database 」。後續 Firebase 公司被 Google 收購,而 Firebase 併入 Google 後兩邊一起對「 Realtime Database 」做了改進並推出 Firestore ,所以 Firebase 提供比較新的數據庫解決方案就是 Firestore 。

    Firebase 平台雖然有了 Firestore 資料庫可以選,但其實舊的 Realtime Database 也還是可以使用。如何選擇可以參考 Firebase 官方說明,主要只是為了保證兼容性,故仍然推薦優先使用新的服務 Firestore。

  • Datastore 和 Firestore 的關係

    當時 Google 在 GCP 平台上原本也有研發自己的 NoSQL 稱為 「 Datastore 」,但後續 Google 收購了 Firebase 公司,就整合自己的 Datastore 和 Firebase 公司的 Realtime Database ,最後 Datastore 進行了品牌重塑(Rebranding),產生的下一代產品就是 Firestore。

    在 GCP Firestore 中可以選擇 Native mode 和 Datastore mode ,而這個 Datastore mode 的存在也比較像是為了兼容舊版的 Datastore,故也推薦優先使用新的 Native mode。

  • 「 Datastore 」和「 Realtime Database 」的關係

    Datastore 和 Realtime Database 都是 Firestore 的前身。目前簡單查資料看起來當時 Google 的 Datastore 似乎沒有<即時同步>和<離線模式>這種功能 ; 而 Firebase 的 Realtime Database 當時在 Availability 一定比不上雲供應商的彈性。故兩個合併算是互相補足一些功能,最後合力推出 Firestore ,並且都可以在自己的平台上使用。

    Firestore 可由 GCP 或者 Firebase 提供。GCP Console 網頁上可以看到的 Firestore 服務 ; 而 Firebase 中使用的資料庫也可以看到 Firestore

以上說明可以統整出一些關鍵:

  • Firebase 原本是一間公司,提供的 BaaS 平台名稱也叫 Firebase
  • Firebase 並不是資料庫,是一個 BaaS 平台
  • Google 的資料庫產品: Datastore 是 Firestore 的前身
  • Firebase 的資料庫產品: Realtime Database 也是 Firestore 的前身
  • 無論是 Firebase 還是 GCP 平台上,都建議新的開發專案都使用 Cloud Firestore。

Data Model

Firestore 資料模型上分成了 collection 、 document 結構。資料存儲在 document 而由 collection 組織管理, document 內還可以包含另一個 subcollection 形成 nested 嵌套結構。

Firestore 中,存儲的基本單位是 document :

  • collection 內會包含 document
  • document 內可以包含 collection 和欄位 fields
  • field 只能存在 document 內。

document 是一個 lightweight record ,可包含欄位 fields,也可以嵌套另一個 collection。

展示範例如下 :

心得

當年第一次使用 Firestore 是在 2022 ~ 2023, Firestore 心得文初次誕生於 2023-03-27。那時對 Firestore 這項服務的心得,雖然其他方面沒有深入測試,但從 DevOps 角度來看是真的蠻糟的… 因為那時每個 GCP Project ,只允許存在唯一一個 Firestore,對於測試環境的建置來說很不方便;即使把 Firestore Serive API 關閉,下次重新 enable api 後,資料仍然會在 Firestore 裡面。另外那時看了一下 Firestore CLI 官方文件,會發現能用操作很少

  • 沒有刪掉整個庫來代替刪除資料的操作
  • 一個 project 只能選擇一種 mode

最後跟 terraform 的整合甚至奇差無比… 舉例來說 :

  • 用 terraform 建立 Firestore database ,只能在全新乾淨從來沒開過 Firestore 的 project 做。當 terraform destroy 之後,再 terraform apply 想建立 Firestore 就會出問題,會回報 Firestore 已存在。
  • terraform 建立其他名稱的 Firestore database 會失敗,強制預設名稱是 (default),注意括號不能省略

2023 年那時候真心覺得雲端全代管無伺服器的 NoSQL 資料庫解決方案不要選 GCP Firestore ,它是我自己使用過 GCP 服務中經驗最讓人不舒服的

2024/8 有機會再回去簡單看一下,發覺那個超級詬病的: 一個 GCP Project ,只允許存在唯一一個 Firestore 的限制好像已經被移除了,從 GCP Console 上可以看得出來我有成功建置新的 database 如下圖

雖然還沒使用 terraform 嘗試再重新建立 Firestore ,但可能已經有修正相關問題了,後續再找時間測試吧。


參考資料