[英]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
}
}
我不知道我是否做對了,所以我非常感謝你們在這個問題上能給我的任何幫助。 提前致謝!
似乎是一個好的起點。 我會做兩個改變。
使用Firebase數據庫時的基本建議是保持數據結構淺/平。 這有很多原因,你至少有兩個。
使用您當前的數據結構,假設您要顯示用戶名列表。 您只能通過收聽/users
來獲取該列表。 這意味着您不僅要獲取每個用戶的用戶名,還要獲取他們的朋友列表。 您將向用戶顯示所有數據的機會很小,這意味着您只是浪費了一些帶寬。
假設您希望允許每個人閱讀用戶名列表。 但是您只希望每個用戶都能夠閱讀他們自己的朋友列表。 您當前的數據結構很難,因為權限級聯和規則不是過濾器 。
更好的結構是將用戶配置文件列表(當前只是它們的名稱)與每個用戶的朋友列表分開。
您當前只有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.