查看了 Firestore 檔案 Google 的 I/O 2019 網路研討會,但我仍然不清楚我的特定用例的正確資料建模。
- 應用程式允許專業服務提供商在預定義的類別(住宿、運動、健康......)和預定義的價格點(50 美元、75 美元、100 美元......)中注冊和發布他們的一項或多項服務。
- 主頁上的用戶首先使用價格點滑塊進行過濾 - 請參閱線框),例如:199€,然后可選擇選擇類別,例如:所有“體育”(199€)和位置(例如:所有運動在英國 199 歐元)。(可選)因為用戶也可以在選擇價格后立即使用按鈕構建他們的串列。相同的“構建串列”按鈕位于類別選擇之后和位置選擇之后。因此可以進行 3 個過濾深度。
考慮到每次過濾時我都想避免數千次讀取,理想的資料結構是什么。三個根級集合(服務提供商、價格點、服務類別?)及其相關檔案?我理解并接受出于過濾目的的非規范化。
這是用于更好地理解過濾的線框圖:





uj5u.com熱心網友回復:
應用程式允許專業服務提供商在預定義的類別(住宿、運動、健康......)和預定義的價格點(50 美元、75 美元、100 美元......)中注冊和發布他們的一項或多項服務。
由于您有預定義的類別、價格和位置,因此對此類資料庫進行建模的最簡單解決方案是擁有一個產品集合:
Firestore-root
|
--- products (collection)
|
--- $productId (document)
|
--- name: "Running Shoe"
|
--- category: "Sport"
|
--- price: 199
|
--- location: "Europe"
|
--- country: "France"
通過這種方式,您可以簡單地執行您需要的所有查詢。由于您沒有指定編程語言,我將用 Java 撰寫查詢,但您可以簡單地將它們轉換為任何其他編程語言。例如,您可以查詢具有特定價格的所有產品:
FirebaseFirestore db = FirebaseFirestore.getInstance();
Query queryByPrice = db.collection("products").whereEqualTo("price", 199);
如果你需要按價格、類別和位置進行查詢,那么你必須鏈接多個whereEqualTo()方法:
Query queryByPrice = db.collection("products")
.whereEqualTo("price", 199)
.whereEqualTo("category", "Sport")
.whereEqualTo("location", "Europe");
但是,如果您需要對結果進行排序(升序或降序),請不要忘記創建索引。
考慮到每次過濾時我都想避免數千次讀取,理想的資料結構是什么。
如果您不需要一次獲得所有結果,那么您必須實作分頁。如果您需要提前知道運動類別中存在的產品數量,那么如果不執行查詢并計算可用產品,這是不可能的。我寫了一篇關于這個主題的文章,叫做:
- 如何計算 Firestore 集合中的檔案數量?
另一個可行的可能解決方案是創建一個包含所有這些數字的檔案。換句話說,正是您向用戶顯示的內容,這些螢屏截圖中存在的所有內容。這樣,您只需支付一次讀取操作。當用戶單擊特定類別時,您才應該執行實際搜索。
我理解并接受出于過濾目的的非規范化。
在這種情況下,不需要對資料進行非規范化。有關此類操作的更多資訊,請在下面查看我的答案:
- Firebase Cloud Firestore 中的非規范化是什么?
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/481049.html
