前言

剛接觸Flutter的這幾個月中,在Cloud Firestore儲存資料時經常遇到許多資料傳輸的問題,但每次遇到問題在網路上尋找解決辦法時,那些資料總是雜亂不堪,StackOverflow上的各式Q&A也通常只解決單一問題。因此我將曾經卡很久的問題統整起來,希望可以幫助一直找不到解答的你(,,・ω・,,)


模型介紹

首先,來簡單介紹Firestore的資料模型

  • Cloud Firestore是No SQL的,也就是非SQL語法的使用方式。然後你可以將整個資料庫看作是一個大的JSON檔,所有文件都會儲存在一層層之間。其中,儲存模型可以分為三種 :
    1. Document : 用來儲存個體,而此個體擁有兩種特質 :
      • 名字 : 可以自己取,也可以讓Firestore隨機生成
      • 屬性 : 詳見下方Reference解釋
    2. Collection : 作為Document的集合
    3. Reference: 用來儲存Document的屬性,其屬性也可以是另一個Collection
  • 如果覺得用文字說明還是不懂的話,可以瞧瞧下面這張圖

    假設今天我們要做一個評論區

  • 解釋 : (由上而下)
    1. 評論區的主要分類就是使用者,所以最底層的Collection就命名為user
    2. 因為使用者一定不只一個,所以我們可以利用Firestore去生成一個隨機的使用者ID,進而去鑑別各個使用者
    3. 而每個使用者都有自己的Reference : 姓名、性別…等等;同時一個使用者會留好幾個評論,所以也將名為comment的Collection設為該使用者的Reference
    4. 接著,針對每個評論去創立其獨立的隨機ID
    5. 最後,就是各個評論的Reference,如標題、時間…等等

模型實作

  • 接下來,我把實際的資料填入模型中,如下圖

  • 很明顯的,我們利用了Firestore中針對Document可以隨機提供ID的功能,去給與使用者與評論各自的ID,往後假設如果需要修改某個評論時,只需要擁有userIDcommentID,就可以讀寫該評論。:.゚ヽ(*´∀`)ノ゚.:。


資料型態

  • 接著要介紹Firestore中的資料型態,常見的整數、字串、浮點數、布林值都有,而比較特別的有 :

    1. Geographical point(地理位置) : 就是經緯度
    2. Map(映射值) : 例如{c: "foo", a: "bar", b: "qux"}的Key-Value格式
    3. Date and time(日期與時間)
    4. Reference(路徑) : 例如 projects/[PROJECT_ID]/...
    5. Array(陣列) : 例如 [1, 2, 3]

    詳細說明,請參閱官方文件

  • 而上述範例中,我們使用到的資料型態分別是 :

    1. String : 姓名、性別、標題
    2. Timestamp : 留言時間

總結

Ok! 我們今天簡單介紹了Firestore的資料模型與結構,而下次就要開始著手Flutter的撰寫瞜~


參考與引用來源

  1. Firebase Cloud Firestore 基礎入門 Part.1 - 簡介
  2. Firestore官方文件 - 資料模型
  3. Firestore官方文件 - 資料型態