大家好,歡迎來到第十一天!在 Day 10,我們成功整合了 Firebase Authentication,讓「省錢拍拍」擁有了使用者系統。我們現在可以區分不同的使用者,但這引出了一個新的、更核心的問題:
User A
的消費紀錄,該如何儲存才能確保 User B
無法看到?
如果我們將所有人的資料都混在同一個地方,不僅會造成查詢效率低下,更會引發嚴重的隱私安全問題。因此,在我們動手寫任何一行資料庫程式碼之前,今天我們要做一件更重要的事:設計資料庫的結構。
今天,我們將深入了解 Firebase 旗下強大的 NoSQL 資料庫 Cloud Firestore,並為我們的 App 設計一個既安全又可擴展的資料模型。
Cloud Firestore 是一個彈性、可擴展的 NoSQL 雲端資料庫。與傳統的 SQL 資料庫(如 MySQL)不同,它不使用「資料表 (Table)」和「資料列 (Row)」。
Firestore 的世界由兩個基本單位構成:
users
集合,或是一個 products
集合。Firestore 的黃金法則非常簡單:資料庫的結構永遠是「集合 -> 文件 -> 集合 -> 文件 -> ...」這樣交錯的層級。這個規則很嚴格:集合底下永遠只能放文件,文件底下則可以放欄位資料,或是下一層的集合 (即子集合)。
比喻:
使用「子集合 (Sub-collection)」
users
集合。users
集合中的每一個文件,其 Document ID 就是該使用者的 User UID(我們在 Day 10 從 Firebase Auth 取得的唯一 ID)。這個文件本身可以存放使用者的個人資料,例如 Email、暱稱等。transactions
的子集合,專門用來存放這位使用者的所有消費紀錄。資料路徑看起來會像這樣:
/users/{user_A_uid}/transactions/{transaction_1_id}
/users/{user_A_uid}/transactions/{transaction_2_id}
/users/{user_B_uid}/transactions/{transaction_3_id}
這個設計的好處是:
User A
的所有資料都被天然地「鎖」在 /users/user_A_uid
這個路徑下,與其他使用者完全隔離。User A
要讀取自己的消費紀錄時,我們只需要查詢他自己的那個 transactions
子集合即可,範圍極小,速度飛快。transactions
子集合」。理論架構結束,讓我們動手建立資料庫。
asia-east1
(台灣))。注意:這個位置一旦選定,就無法更改!為了加深理解,讓我們手動在控制台建立一筆符合我們設計的資料。
users
。email
(String),值為該使用者的 email;createdAt
(Timestamp),值為當前時間。儲存。users
集合,裡面有一個使用者文件。請點選這個使用者文件。transactions
。title
(String) "晚餐", amount
(Number) 200, date
(Timestamp) 當前時間。儲存。新增集合
新增子集合
最後建立的雲端資料
這樣就成功地在雲端手動建立了一筆符合的資料了!
今天我們一行 Flutter
程式碼都沒寫,但卻完成了至關重要的一步——資料庫的架構設計。我們理解了 Firestore 的 Collection
/ Document
核心概念,並設計了一個利用「子集合」來隔離使用者資料的、可擴展且安全的資料模型。
明天,我們將正式回歸程式碼,學習如何對 Firestore 進行 CRUD (新增、讀取、更新、刪除) 操作,讓我們的 App 真正具備將資料存儲到雲端的能力!