我是 Firestore 的新手并正在構建一個活動計劃應用程式,但我不確定構建資料的最佳方法是考慮查詢速度和基于讀取的 Firestore 成本等。在我能想到的兩個選項中,我有一個users收藏和events收藏
選項 1:
在users集合中,每個用戶都有一系列eventIds他們正在主持的活動以及他們正在參加的活動。然后我查詢該用戶的events集合,eventIds以便向用戶列出適當的事件
選項 2:
對于events集合中的每個事件,都有一個hostId和一個陣列attendeeIds。所以我會查詢events集合中的事件在哪里hostID === user.id和在哪里attendeeIds.includes(user.id)
考慮到可能有數千個事件需要迭代,我試圖從性能和成本的角度找出哪個是最好的。events通過 an 搜索集合是否更好,eventId因為它會在找到所有事件時停止迭代,或者因為它一次搜索一個而那么慢eventId?也許有比我上面沒有提到的更好的方法來做到這一點。非常感謝您的反饋。
uj5u.com熱心網友回復:
我建議使用選項 2,因為它可能會為您節省一些閱讀量:
- 您不必首先查詢用戶的檔案,然后再運行另一個查詢,例如
where(documentId(), "in", [...userEvents]),如果您有很多,也可以單獨獲取它們中的每一個。 - 在嘗試撰寫安全規則時,您可以直接檢查事件是否屬于嘗試更新事件的用戶
resource.data.hostId == request.auth.uid。
使用第一個選項時,您必須在安全規則中查詢用戶的檔案,以檢查該 eventID 是否存在于該事件陣列中(這可能需要您再次閱讀)。查看檔案 以獲取有關計費的更多資訊。
uj5u.com熱心網友回復:
除了@Dharmaraj 的回答,請注意,沒有一個解決方案在性能方面比其他解決方案更好。在 Firestore 中,查詢性能取決于您請求(讀取)的檔案數量,而不是您搜索的檔案數量。您是在 100 個檔案的集合中搜索 10 個檔案還是在包含 1 億個檔案,回應時間將始終相同。
從計費的角度來看,是的,第一個解決方案意味著要閱讀額外的檔案,因為您首先需要實際閱讀用戶檔案。但是,讀取陣列并獲取所有相應的事件也會非常快。
請記住,在 NoSQL 世界中,我們總是根據我們打算執行的查詢來構建資料庫。因此,如果查詢回傳您感興趣的檔案,并產生最少的讀取,那么這就是您應該繼續使用的解決方案。另請記住,您將始終需要支付與查詢回傳的檔案數量相等的讀取次數。
關于安全性,這兩種解決方案都可以相對容易地得到保護。現在由您決定哪一個更適合您的用例。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/505858.html
