Firestore 入門:文件資料、即時更新與存取規則
前言
如果 App 要在多個裝置上同步資料,也希望離線時仍能操作,Firestore 值得評估。不過資料怎麼切成文件、查詢怎麼做,以及誰可以讀寫,都得先想清楚。
這篇從文件與集合開始,接著看即時監聽、安全規則和費用。讀完後,再拿需求去比較它與其他資料庫。

Firestore 的階層固定是 Collection → Document → Subcollection,文件才承載欄位。查詢與即時監聽都受 Security Rules 約束,複合查詢通常需要對應 Index。Transaction 與 Batched write 能把多筆變更當成一個原子操作;但刪除父 Document 不會自動刪除底下的 Subcollection,清理責任要另外設計。
什麼是 Firestore?
Firestore 是 GCP 的 NoSQL 文件資料庫(Document Database),資料以 JSON-like 文件形式儲存:
流程圖暫時無法顯示。可先查看下方的流程與節點文字,或重新整理頁面後再試。
查看流程與節點文字
箭頭表示流程方向;方括號與引號內是節點名稱,可搭配下方圖解閱讀。
flowchart TB DB["Firestore Database"] --> USERS["Collection<br/>users"] USERS --> U1["Document<br/>user-001"] USERS --> U2["Document<br/>user-002"] U1 --> FIELDS1["Fields<br/>name、email、age"] U2 --> FIELDS2["Fields<br/>name = Alice"] U1 --> ORDERS["Subcollection<br/>orders"] ORDERS --> O1["Document<br/>order-001"] ORDERS --> O2["Document<br/>order-002"] O1 --> ORDER_FIELDS["Fields<br/>amount、status"] DELETE["刪除 user-001 Document"] -. "不會自動遞迴刪除" .-> ORDERS ORDERS -. "須由程式或管理工具<br/>另外清理" .-> CLEANUP["Recursive delete/<br/>生命週期清理"]
Firestore 路徑必須以 Collection 與 Document 交替;只有 Document 承載欄位。Subcollection 是獨立資料集合,刪除父 Document 不會連帶刪除它,資料模型必須包含遞迴清理策略。
Firestore 是 Cloud Datastore 的下一代。原本的 Datastore 已經不是獨立產品了,現在改以 Firestore in Datastore mode 的形式繼續活著。
Native Mode vs Datastore Mode
建立 Firestore 資料庫時,你必須選擇模式:
| 特性 | Native Mode | Datastore Mode |
|---|---|---|
| API | Firestore API | Datastore API |
| 即時同步 | 支援 | 不支援 |
| 離線支援 | 支援(Mobile/Web SDK) | 不支援 |
| 強一致性 | 全面強一致性 | 全面強一致性 |
| 適合場景 | Mobile/Web 與伺服器端新應用 | 依賴 Datastore API 的既有應用 |
| App Engine 整合 | 可由應用呼叫 Firestore API | 相容既有 Datastore 程式碼 |
表格超出欄寬時,可左右捲動;鍵盤可聚焦表格後用左右方向鍵查看。
強一致性(strong consistency)指寫入成功後,後續讀取與查詢能看到已提交的資料;不用靠等幾秒來避開舊值。Native 與 Datastore Mode 都支援。
能切換嗎?
只有資料庫是空的時候才能切換模式。一旦寫進去任何資料,模式就鎖死了。
建議
- 新應用若沒有 Datastore API 相容需求,通常選 Native Mode;伺服器端程式也能使用。
- 若現有 App Engine 應用依賴 Datastore API,再考慮 Datastore Mode。
💡 重點提點
模式只能在資料庫為空時切換;有資料後若要更換,就得規劃新資料庫與資料遷移。建立前先確認應用使用 Firestore API 還是既有 Datastore API,不必因為程式跑在伺服器端就選 Datastore Mode。(參考:Firestore API 模式選擇、資料庫類型變更限制)

建立資料庫時要選原生模式(Native)或與 Datastore 相容(Datastore Mode)。有資料後便不能直接切換模式;先對照應用使用的 API 再選。若選 Native,還會看到安全性規則的初始設定:正式資料不要使用暫時開放存取的測試設定。
流程圖暫時無法顯示。可先查看下方的流程與節點文字,或重新整理頁面後再試。
查看流程與節點文字
箭頭表示流程方向;方括號與引號內是節點名稱,可搭配下方圖解閱讀。
flowchart TB
subgraph CHOOSE["1. 選擇相容模式"]
direction TB
START["建立新的 Firestore Database"] --> LEGACY{"既有 Datastore 應用,<br/>必須沿用 API 與行為?"}
LEGACY -->|"是"| DATASTORE["Datastore Mode<br/>維持伺服器端相容性"]
LEGACY -->|"否"| CLIENT{"需要 Mobile/Web SDK、<br/>即時監聽或離線同步?"}
CLIENT -->|"是"| NATIVE["Native Mode<br/>新應用的預設建議"]
CLIENT -->|"否或不確定"| NATIVE
end
subgraph COMMIT["2. 寫入前確認"]
direction TB
EMPTY{"第一筆資料<br/>已經寫入?"}
EMPTY -->|"尚未"| REVIEW["仍可重新檢查模式"]
EMPTY -->|"已寫入"| LOCKED["模式鎖定<br/>要改只能建新資料庫並遷移"]
end
DATASTORE --> EMPTY
NATIVE --> EMPTY 模式不是可以日後隨意切換的功能開關。除非明確承接 Datastore 應用,否則新專案選 Native Mode;第一筆資料寫入前,應再次確認 SDK、即時功能與遷移需求。
Enterprise edition 另有 Firestore with MongoDB compatibility(見下面的 Editions)。
資料模型核心概念
文件(Document)
文件是 Firestore 的基本單位,類似 JSON 物件:
# Python 範例:新增文件
from google.cloud import firestore
db = firestore.Client()
# 自動生成 ID
doc_ref = db.collection("users").document()
doc_ref.set({
"name": "Bobo",
"email": "bobo@example.com",
"age": 30,
"tags": ["gcp", "cloud"],
"address": {
"city": "Taipei",
"country": "Taiwan"
}
})
# 指定 ID
db.collection("users").document("user-001").set({
"name": "Alice"
})
重要限制
| 項目 | 限制 |
|---|---|
| 文件大小上限 | 1 MiB(1,048,576 bytes) |
| 欄位值大小上限 | 1 MiB - 89 bytes |
| 子集合巢狀深度 | 100 層 |
| 文件名稱大小 | 6 KiB |
| Map/Array 巢狀深度 | 20 層 |
表格超出欄寬時,可左右捲動;鍵盤可聚焦表格後用左右方向鍵查看。
這裡的「文件名稱大小 6 KiB」指的是整段完整路徑(例如 users/user-001/orders/order-001)的上限,不要跟單一文件 ID(你自己取或自動生成的那一小段,上限 1,500 bytes)搞混。一般情況根本碰不到,路徑取名別太誇張就好。
集合(Collection)
集合是放文件的容器,不用事先建好。寫進第一個文件時它自動冒出來,刪掉最後一個文件時又自動消失。
子集合(Subcollection)
文件可以包含子集合,用來建立層級關係:
# 在 user-001 下建立 orders 子集合
db.collection("users").document("user-001") \
.collection("orders").document("order-001").set({
"item": "Cloud certification",
"amount": 200
})
流程圖暫時無法顯示。可先查看下方的流程與節點文字,或重新整理頁面後再試。
查看流程與節點文字
箭頭表示流程方向;方括號與引號內是節點名稱,可搭配下方圖解閱讀。
%%{init: {"flowchart": {"rankSpacing": 30, "nodeSpacing": 30}}}%%
flowchart TB
START["一對多或巢狀資料<br/>要放在哪裡?"] --> BINARY{"大型二進位檔,<br/>或可能超過 1 MiB?"}
BINARY -->|"是"| STORAGE["Cloud Storage<br/>Firestore 只存 metadata 與 URI"]
BINARY -->|"否"| BOUNDED{"筆數有明確上限,<br/>且總與父文件一起讀寫?"}
BOUNDED -->|"是"| EMBED["嵌入 Map/Array<br/>監控文件大小與索引膨脹"]
BOUNDED -->|"否"| PARENT{"隸屬單一父項,<br/>並需獨立分頁或權限?"}
PARENT -->|"是"| SUB["Subcollection<br/>規劃遞迴刪除與群組索引"]
PARENT -->|"否,需跨父項查詢"| TOP["Top-level Collection<br/>保存 parentId 並用 Rules 維護關聯"] Firestore 沒有 JOIN,也不會替你維護父子生命週期。資料是否一起讀取、會不會無上限成長、是否要跨父項查詢,比「看起來像樹狀」更能決定要嵌入、建 Subcollection 或使用頂層 Collection。
CRUD 操作
讀取
# 讀取單一文件
doc = db.collection("users").document("user-001").get()
if doc.exists:
print(doc.to_dict())
# 查詢
query = db.collection("users") \
.where("age", ">=", 25) \
.where("tags", "array_contains", "gcp") \
.order_by("age") \
.limit(10)
for doc in query.stream():
print(f"{doc.id}: {doc.to_dict()}")
更新
# 更新特定欄位(不影響其他欄位)
db.collection("users").document("user-001").update({
"age": 31,
"address.city": "Kaohsiung" # 更新巢狀欄位
})
刪除
# 刪除文件
db.collection("users").document("user-001").delete()
# 刪除特定欄位
db.collection("users").document("user-001").update({
"age": firestore.DELETE_FIELD
})
批次與交易
# 批次寫入(現已無 500 筆上限,改受單次提交約 10 MiB 大小限制;舊版曾限制 500 筆)
batch = db.batch()
for i in range(100):
ref = db.collection("items").document(f"item-{i}")
batch.set(ref, {"value": i})
batch.commit()
# 交易(讀取 + 寫入的原子操作)
@firestore.transactional
def transfer(transaction, from_ref, to_ref, amount):
from_doc = from_ref.get(transaction=transaction)
to_doc = to_ref.get(transaction=transaction)
from_balance = from_doc.get("balance") - amount
to_balance = to_doc.get("balance") + amount
transaction.update(from_ref, {"balance": from_balance})
transaction.update(to_ref, {"balance": to_balance})
transaction = db.transaction()
transfer(transaction,
db.collection("accounts").document("A"),
db.collection("accounts").document("B"),
100)
流程圖暫時無法顯示。可先查看下方的流程與節點文字,或重新整理頁面後再試。
查看流程與節點文字
箭頭表示流程方向;方括號與引號內是節點名稱,可搭配下方圖解閱讀。
flowchart TB
subgraph DECIDE["1. 判斷寫入依賴"]
direction TB
START["這次操作要修改幾筆文件,<br/>新值如何決定?"] --> COUNT{"只修改單一 Document?"}
COUNT -->|"否"| READ{"寫入內容依賴<br/>剛讀到的目前值?"}
end
subgraph METHOD["2. 選擇原子操作"]
direction TB
SINGLE["set/update/<br/>delete<br/>單文件寫入具原子性"]
BATCH["Batched Write<br/>多筆一起成功或失敗"]
TX["Transaction<br/>先讀再寫,<br/>衝突時重試"]
end
subgraph SAFETY["3. 保持可重跑"]
direction TB
SIDE{"交易內包含寄信、<br/>付款等外部副作用?"}
SIDE -->|"是"| REMOVE["移出交易<br/>改用 Outbox/後續工作"]
SIDE -->|"否"| RETRY["避免全域可變狀態<br/>讓函式可安全重跑"]
end
COUNT -->|"是"| SINGLE
READ -->|"否"| BATCH
READ -->|"是"| TX
TX --> SIDE Batch 適合「已知道要寫什麼」的多筆原子變更;Transaction 適合「必須先讀目前狀態才能決定新值」。Transaction 可能重跑,因此外部副作用不能直接放在交易函式裡。
即時監聽(Real-time Listeners)
Native Mode 的獨家功能,資料變更時自動推送通知:
# 監聽單一文件
def on_snapshot(doc_snapshot, changes, read_time):
for doc in doc_snapshot:
print(f"Changed: {doc.to_dict()}")
doc_ref = db.collection("users").document("user-001")
doc_watch = doc_ref.on_snapshot(on_snapshot)
# 監聽查詢結果
query_ref = db.collection("users").where("age", ">=", 25)
query_watch = query_ref.on_snapshot(on_snapshot)
# 停止監聽
doc_watch.unsubscribe()
用戶端訂閱某份文件或查詢後,結果有變動時會收到更新,不必自己固定間隔輪詢(polling)。但連線中斷、重新連線與畫面暫存狀態,仍要在應用裡處理。
索引設計
自動索引
Firestore 會幫每個欄位自動建好單欄位索引,基本的等式和範圍查詢都罩得住。
複合索引
複合索引(composite index)就是把「好幾個欄位綁在一起」建的索引。當你的查詢同時用到多個欄位(例如又篩 age、又排序 name),單欄位索引不夠用,就得手動建一個複合索引:
# 這個查詢需要複合索引:(age ASC, name ASC)
query = db.collection("users") \
.where("age", ">=", 25) \
.order_by("age") \
.order_by("name")
# 建立複合索引
gcloud firestore indexes composite create \
--collection-group=users \
--field-config=field-path=age,order=ascending \
--field-config=field-path=name,order=ascending
索引限制
| 項目 | 限制 |
|---|---|
| 複合索引數量(無帳單) | 200 |
| 複合索引數量(有帳單) | 1,000 |
| 單一文件的索引項目數 | 40,000 |
| 複合索引最大欄位數 | 100 |
表格超出欄寬時,可左右捲動;鍵盤可聚焦表格後用左右方向鍵查看。
流程圖暫時無法顯示。可先查看下方的流程與節點文字,或重新整理頁面後再試。
查看流程與節點文字
箭頭表示流程方向;方括號與引號內是節點名稱,可搭配下方圖解閱讀。
flowchart TB
subgraph DESIGN["1. 由查詢反推索引"]
direction TB
START["定義篩選、排序、<br/>集合範圍與回傳筆數"] --> SIMPLE{"只有單欄位條件<br/>或簡單排序?"}
SIMPLE -->|"是"| AUTO["使用自動單欄位索引"]
SIMPLE -->|"否"| MULTI{"組合多個 where、<br/>range 與 orderBy?"}
MULTI -->|"是"| COMPOSITE["建立 Composite Index<br/>欄位順序符合查詢"]
MULTI -->|"否"| EXEMPT["豁免不查詢的大欄位<br/>降低寫入與儲存成本"]
end
subgraph VALIDATE["2. 執行與驗證"]
direction TB
TEST["在 Emulator/測試環境<br/>執行實際查詢"] --> ERROR{"出現 missing index?"}
ERROR -->|"是"| LINK["依錯誤提供的組合建索引<br/>等待建置後重試"]
ERROR -->|"否"| REVIEW["量測讀取筆數、延遲、<br/>索引項目與寫入成本"]
end
AUTO --> TEST
COMPOSITE --> TEST
EXEMPT --> TEST Firestore 不是「沒有索引也能掃完整集合」的資料庫;可執行的查詢必須有對應索引。先由應用查詢反推索引,不要為所有欄位組合預建 Composite Index,否則會增加寫入與儲存成本。
安全規則 vs IAM
安全規則(Security Rules)
用於 Mobile/Web 用戶端的存取控制:
// firestore.rules
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
// 用戶只能讀寫自己的資料
match /users/{userId} {
allow read, write: if request.auth != null
&& request.auth.uid == userId;
}
// 公開讀取,只有管理員能寫入
match /posts/{postId} {
allow read: if true;
allow write: if request.auth.token.admin == true;
}
}
}
IAM
用於伺服器端的存取控制:
# 授予 Service Account Firestore 讀寫權限
gcloud projects add-iam-policy-binding my-project \
--member="serviceAccount:my-app-sa@my-project.iam.gserviceaccount.com" \
--role="roles/datastore.user"
何時用哪個?
流程圖暫時無法顯示。可先查看下方的流程與節點文字,或重新整理頁面後再試。
查看流程與節點文字
箭頭表示流程方向;方括號與引號內是節點名稱,可搭配下方圖解閱讀。
flowchart TB
START["誰直接呼叫 Firestore?"] --> CLIENT{"Firebase Mobile/Web SDK<br/>由終端使用者直接存取?"}
CLIENT -->|"是"| RULES["Security Rules<br/>以 request.auth、文件路徑與資料驗證"]
RULES --> AUTH["Firebase Authentication<br/>提供使用者身分與 claims"]
CLIENT -->|"否,由後端或自動化呼叫"| SERVER["Server SDK/REST<br/>使用 Service Account"]
SERVER --> IAM["IAM<br/>roles/datastore.* 與最小權限"]
IAM --> BYPASS["伺服器 SDK 不靠 Security Rules<br/>應在後端再做業務授權"]
START --> MIXED{"同時有用戶端直連<br/>與後端管理作業?"}
MIXED -->|"是"| BOTH["兩套都要設計<br/>Rules 保護客戶端、IAM 保護後端"]
RULES --> TEST["用 Emulator、Rules tests<br/>與拒絕案例驗證"]
IAM --> AUDIT["用 IAM Policy Analyzer<br/>與 Audit Logs 驗證"] Security Rules 與 IAM 不是互相替代:它們保護不同呼叫路徑。用戶端直連要把使用者層級條件寫進 Rules;伺服器端則以 Service Account 和 IAM 進入,再由後端程式執行業務授權。
Firestore Editions
| 特性 | Standard | Enterprise |
|---|---|---|
| 基本 CRUD | 支援 | 支援 |
| 即時同步 | 支援 | 支援 |
| 備份 | 標準備份 | 標準備份 |
| PITR(時間點還原) | 7 天 | 7 天 |
| 向量搜尋 | 支援 | 支援 |
| 全文搜尋 | 不支援 | 支援(Preview) |
| MongoDB 相容 | 不支援 | 支援 |
表格超出欄寬時,可左右捲動;鍵盤可聚焦表格後用左右方向鍵查看。

版本選擇對應上面那張 Editions 表。Standard 就是一般用的簡易查詢引擎; Enterprise 多了全文搜尋(Preview)跟 MongoDB 相容,需要那兩個功能才升上去。右邊費用摘要會隨版本即時換算——Standard 的讀寫單價比較好抓成本。
多資料庫支援
Firestore 支援在同一個專案中建立多個資料庫(Named Databases):
# 建立額外的資料庫
gcloud firestore databases create \
--database=analytics-db \
--location=asia-east1 \
--type=firestore-native
# 連線到特定資料庫
db = firestore.Client(database="analytics-db")
💡 重點提點
一個專案只有一個資料庫可享免費額度,資格給第一個建立的資料庫,名稱不一定要是
(default)。後續新增的資料庫會依使用量計費;練習前先確認哪個資料庫取得免費額度,再估算讀寫、儲存與網路用量。(參考:Firestore 計費說明)
流程圖暫時無法顯示。可先查看下方的流程與節點文字,或重新整理頁面後再試。
查看流程與節點文字
箭頭表示流程方向;方括號與引號內是節點名稱,可搭配下方圖解閱讀。
flowchart TB
subgraph EDITION["1. 選擇 Edition"]
direction TB
START["建立 Firestore Database"] --> FEATURE{"需要 MongoDB 相容 API<br/>或 Enterprise 專屬能力?"}
FEATURE -->|"是"| ENTERPRISE["Enterprise<br/>驗證相容性、<br/>區域與費用"]
FEATURE -->|"否"| STANDARD["Standard<br/>一般 Native 應用起點"]
end
subgraph DATABASE["2. 決定資料庫隔離"]
direction TB
ISOLATION{"需要獨立資料庫<br/>做隔離、位置<br/>或生命週期?"}
ISOLATION -->|"否"| DEFAULT["使用 (default)<br/>確認是否為首個資料庫"]
ISOLATION -->|"是"| NAMED["建立 Named Database<br/>估算使用量與費用"]
NAMED --> GUARD["獨立設定 IAM、<br/>備份、索引、<br/>TTL、預算與監控"]
end
ENTERPRISE --> ISOLATION
STANDARD --> ISOLATION Edition 決定查詢引擎與相容能力,資料庫名稱則用於區分資料與生命週期。免費額度看建立順序,不看名稱:一個專案只有首個資料庫符合資格;新增資料庫要另外估算成本與治理需求。
TTL(自動過期刪除)
Firestore TTL 讓你指定欄位作為過期時間,文件到期後自動刪除:
# 設定 TTL 欄位
gcloud firestore fields ttls update expiresAt \
--collection-group=sessions \
--enable-ttl
from datetime import datetime, timedelta
# 建立 30 天後自動過期的文件
db.collection("sessions").add({
"userId": "user-001",
"expiresAt": datetime.now() + timedelta(days=30)
})
定價與免費層
免費層(僅限專案的首個資料庫)
| 項目 | 免費額度(Standard edition) |
|---|---|
| 文件讀取 | 50,000 次/天 |
| 文件寫入 | 20,000 次/天 |
| 文件刪除 | 20,000 次/天 |
| 儲存空間 | 1 GiB |
| 對外流量 | 10 GiB/月 |
表格超出欄寬時,可左右捲動;鍵盤可聚焦表格後用左右方向鍵查看。
超過免費層(美國區域)
| 項目 | 費用 |
|---|---|
| 文件讀取 | $0.03 / 100,000 次 |
| 文件寫入 | $0.09 / 100,000 次 |
| 文件刪除 | $0.01 / 100,000 次 |
| 儲存空間 | $0.15 / GiB / 月 |
表格超出欄寬時,可左右捲動;鍵盤可聚焦表格後用左右方向鍵查看。
Firestore vs Cloud SQL vs Bigtable
若要比較文件資料庫、關聯式資料庫與寬列資料庫,可以先從資料模型和查詢方式看起:
| 特性 | Firestore | Cloud SQL | Bigtable |
|---|---|---|---|
| 類型 | 文件型 NoSQL | 關聯式 SQL | 寬列型 NoSQL |
| 資料模型 | JSON 文件 | 表格(Row/Column) | Key-Value 寬列 |
| 查詢語言 | Firestore Query | SQL | Row Key Scan |
| 擴展性 | 自動水平擴展 | 垂直擴展 + 讀取複本 | 自動水平擴展 |
| 單筆大小 | 1 MiB | 依欄位定義 | 10 MB/cell、100 MB/row(建議值) |
| 免費層 | 50K 讀/天 | 無 | 無 |
| 最適合 | Mobile/Web App | 交易型系統 | 時序/IoT/分析 |
表格超出欄寬時,可左右捲動;鍵盤可聚焦表格後用左右方向鍵查看。
選型公式
流程圖暫時無法顯示。可先查看下方的流程與節點文字,或重新整理頁面後再試。
查看流程與節點文字
箭頭表示流程方向;方括號與引號內是節點名稱,可搭配下方圖解閱讀。
flowchart LR
subgraph NEED["1. 判斷核心需求"]
direction TB
START["描述資料關係、查詢、<br/>規模與用戶端需求"] --> RELATIONAL{"需要 JOIN、<br/>外鍵、複雜 SQL<br/>或關聯式交易?"}
RELATIONAL -->|"否"| WIDE{"TB/PB 級,<br/>並以 Row Key<br/>做高吞吐時序/<br/>IoT 存取?"}
WIDE -->|"否"| DOCUMENT{"文件型 Mobile/<br/>Web 資料,<br/>需要即時同步<br/>或離線 SDK?"}
end
subgraph SERVICE["2. 選擇服務"]
SQL["Cloud SQL<br/>關聯式 OLTP"]
BIGTABLE["Bigtable<br/>寬列、低延遲與水平擴展"]
FIRESTORE["Firestore Native<br/>文件查詢與即時監聽"]
RECHECK["重新檢查 Spanner、<br/>BigQuery、<br/>Cloud Storage 等服務"]
end
RELATIONAL -->|"是"| SQL
WIDE -->|"是"| BIGTABLE
DOCUMENT -->|"是"| FIRESTORE
DOCUMENT -->|"否"| RECHECK NoSQL 不是單一類型。Firestore 解決應用文件與即時同步,Bigtable 解決以 Row Key 為中心的大規模高吞吐存取;一旦需求核心是 JOIN、關聯完整性與 SQL 交易,就應優先選 Cloud SQL。
ACE 考試重點整理
必背知識點
- Firestore 的資料存取模式在建立資料庫時選定:Native(推薦)、Datastore,以及 Enterprise edition 才有的 Firestore with MongoDB compatibility;資料庫有資料後就不能更改
- 文件大小上限 1 MiB,子集合深度上限 100 層
- 即時監聽是 Native Mode 獨有功能
- 安全規則用於 Mobile/Web,IAM 用於伺服器端
- 免費層:50K 讀取/天、20K 寫入/天
- 多資料庫支援:同一專案可建立多個資料庫
- 自動索引:單欄位自動建索引,多欄位需手動建複合索引
常見陷阱題
Q:Firestore 和 Datastore 是兩個不同的產品嗎? A:不是。Datastore 已經併入 Firestore,以 Firestore in Datastore mode 的形式存在。新專案請選 Native Mode。
Q:Firestore 適合儲存 10 MB 的檔案嗎? A:不適合。文件大小上限 1 MiB。大型檔案應存在 Cloud Storage,Firestore 只存 metadata 和 GCS 路徑。
Q:Mobile App 直接存取 Firestore,要用 IAM 還是 Security Rules? A:Security Rules。IAM 用於伺服器端,Security Rules 才能做到用戶級別的存取控制。
Q:需要即時同步資料給多個用戶端,用什麼服務? A:Firestore(Native Mode)的即時監聽功能。
總結
Firestore 適合文件型資料,也能支援即時同步和部分用戶端的離線使用。建立資料庫前先確認模式與位置;設計權限時分清用戶端 Security Rules 和伺服器端 IAM。最後用預期讀寫量估算費用,別把免費額度當成所有資料庫都適用的固定折扣。
下一課 GCP-113:Bigtable 深度解析,來看 Google 那套 PB 級的寬列型 NoSQL 資料庫。
資料庫選型系列
| 課程 | 服務 | 適合場景 |
|---|---|---|
| GCP-108 | Cloud SQL | 中小型 OLTP、傳統 SQL 應用 |
| 本課 GCP-112 | Firestore | Mobile/Web App、即時同步 |
| GCP-113 | Bigtable | PB 級 IoT/時序、低延遲高吞吐 |
| ACE-211 | BigQuery | PB 級分析、BI 報表 |
| ACE-213 | Spanner | 全球規模 OLTP、強一致性 |
| GCP-115 | Memorystore | 微秒級快取、Session 管理 |
表格超出欄寬時,可左右捲動;鍵盤可聚焦表格後用左右方向鍵查看。
還在比較資料庫?可以接著看 Google Cloud 資料庫怎麼選?。
讀完後,留一個學習紀錄
試著用自己的話說出一個重點,以及你會如何運用。實作文章請先核對結果與清理資源,再標記為讀完。
文章進度以你確認讀完的標記為準,可隨時取消。舊版造訪紀錄保留,但不計入讀完;這份自評不代表已掌握內容。