簡體   English   中英

你如何將model的用戶和Firebase中的朋友收藏起來?

[英]How would you model a collection of users and friends in Firebase?

我正在嘗試使用 Firebase 創建一個數據庫 (json)。我搜索了文檔和 the.net,但找不到明確的開始方式。 我想要一個用戶數據庫。 每個用戶(表示為 UID)都應該有一個昵稱和一個朋友列表。

我嘗試制作一個 .json 文件,如下所示:

{
  users:{

  }
}

並將其添加到 Firebase 控制台以開始使用,但它不起作用。 我該怎么做?

數據庫應如下所示:

{
  users:{
       UID:{
          nickname: hello
          friends: UID2
       }
       UID2:{
          nickname: world
          friends: UID
  }
}

我不知道我是否做對了,所以我非常感謝你們在這個問題上能給我的任何幫助。 提前致謝!

似乎是一個好的起點。 我會做兩個改變。

  1. 保持列表是朋友分開
  2. 將朋友保留為一組,而不是單個值或數組

保持列表是朋友分開

使用Firebase數據庫時的基本建議是保持數據結構淺/平。 這有很多原因,你至少有兩個。

  1. 使用您當前的數據結構,假設您要顯示用戶名列表。 您只能通過收聽/users來獲取該列表。 這意味着您不僅要獲取每個用戶的用戶名,還要獲取他們的朋友列表。 您將向用戶顯示所有數據的機會很小,這意味着您只是浪費了一些帶寬。

  2. 假設您希望允許每個人閱讀用戶名列表。 但是您只希望每個用戶都能夠閱讀他們自己的朋友列表。 您當前的數據結構很難,因為權限級聯規則不是過濾器

更好的結構是將用戶配置文件列表(當前只是它們的名稱)與每個用戶的朋友列表分開。

把朋友當作一套

您當前只有friends屬性的單個值。 當您開始構建應用程序時,您將需要存儲多個朋友。 最常見的是然后存儲一個數組或UIDS列表:

[ UID1, UID2, UID3 ]

要么

{
  "-K.......1": "UID1"
  "-K.......5": "UID2"
  "-K.......9": "UID3"
}

遺憾的是,這些數據結構的類型錯誤。 數組和第二個集合都是列表:(可能)非唯一值的有序集合。 但是,不需要訂購朋友的集合,它必須是獨一無二的。 我要么在收藏中,要么我不在那里,我不能在那里多次,訂單通常無關緊要。 這就是為什么你經常最終尋找與上述模型相關的friends.contains("UID1")ref.orderByValue().equalTo("UID1")操作。

更好的模型是將數據存儲為一組。 集合是無序值的集合,必須是唯一的。 非常適合朋友聚會。 要將其存儲在Firebase中,我們使用UID作為集合的關鍵字。 由於我們無法存儲沒有值的鍵,因此我們使用true作為虛擬值。

所以這導致了這個數據模型:

{
  users:{
     UID:{
       nickname: hello
     }
     UID2:{
       nickname: world
     }
  }
  friends:{
     UID:{
       UID2: true
     }
     UID2:{
       UID: true
     }
  }
}

對於一般的NoSQL數據建模和Firebase,還有更多的說法/了解。 要了解這一點,我建議閱讀NoSQL數據建模並觀看Firebase for SQL開發人員

我保留了一個Friends集合,其中users字段是 2 個用戶 ID 的數組: ['user1', 'user2']

獲得用戶的朋友很容易:

friendsCollection.where("users", "array-contains", "user1").get()

這應該會為您提供 user1 出現的所有文檔。

現在棘手的部分是如何查詢單個朋友。 理想情況下, firebase 將支持array-contains中的多個值,但他們不會這樣做: https://github.com/firebase/firebase-js-sdk/issues/1169

所以他們解決這個問題的方法是在添加文檔之前規范化users列表。 基本上,我利用 JS 的真實性來檢查哪個userId更大,哪個更小,然后按該順序制作一個列表。

添加好友時:

const user1 = sentBy > sentTo ? sentBy : sentTo
const user2 = sentBy > sentTo ? sentTo : sentBy

const friends = { users: [user1, user2] }

await friendsCollection.add(friends)

這基本上確保了無論誰是友誼的一部分,都將始終以相同的順序列出,因此在查詢時,您可以:

await friendsCollection.where("users", "==", [user1, user2]).get()

這顯然只有效,因為我相信列表總是有 2 個項目,並且相信 JS 真實性會確定性地工作,但它是解決這個特定問題的一個很好的解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM