我正處于我的 App DB 的設計階段,在 Firebase 上運行。我想知道存盤我的資料的最佳方法是什么。我知道 Firebase 只回傳檔案的第一層,除非您明確查詢子集合并且我想盡可能減少額外的讀取以節省 $.
簡而言之,我的資料庫保存設備,每個設備都可以有服務器需要按 FIFO 順序發送回他的訊息(回呼)。用戶在 App 中觀看設備時會看到等待的回呼。
我的第一個想法是為每個設備保存一組訊息,但是當服務器想知道下一個要發送的回呼是什么時,這種方法將需要對每個設備中的每個回呼進行兩次讀取。
我的第二種方法是在每個設備檔案中將回呼保留在陣列中,但我不確定這是否是正確的方法,由于某種原因,我聽起來很混亂。
我的第三個選擇是在每個回呼中保存一個帶有 deviceID 欄位的回呼集合。我在這種方法中看到的缺點是,在應用程式中查看設備及其回呼時,我需要執行某種“加入”,并且下一次回呼的搜索時間正在增加,盡管仍然合理(登錄(n) 時間)。
理論上講,系統可以存盤數萬臺設備,每臺設備可以有10-100個在線回呼,每個回呼可以每15秒或更長時間呼叫一次。
uj5u.com熱心網友回復:
我的第一個想法是為每個設備保存一組訊息,但是當服務器想知道下一個要發送的回呼是什么時,這種方法將需要對每個設備中的每個回呼進行兩次讀取。
如果您需要查詢與設備對應的訊息,那么將它們存盤到集合中是一個不錯的選擇。這是因為您可以執行簡單和復合 qureis。
我的第二種方法是在每個設備檔案中將回呼保留在陣列中,但我不確定這是否是正確的方法,由于某種原因,我聽起來很混亂。
如果您只需要列出它們而不是查詢,那么在我看來這是一個非常好的主意,但前提是檔案的大小可以保持在最大限制以下。因此,當涉及到可以放入檔案的資料量時,存在一些限制。根據有關使用和限制的官方檔案:
檔案的最大大小:1 MiB(1,048,576 位元組)
如您所見,單個檔案中的資料總量限制為 1 MiB。當我們談論存盤文本時,您可以存盤很多內容,但隨著陣列變大,請注意此限制。
我的第三個選擇是在每個回呼中保存一個帶有 deviceID 欄位的回呼集合。我在這種方法中看到的缺點是,在應用程式中查看設備及其回呼時,我需要執行某種“加入”,并且下一次回呼的搜索時間正在增加,盡管仍然合理(登錄(n) 時間)。
當再次談論集合時,我們又回到了第一個問題。請記住,我們通常會根據要執行的查詢來構建 Firestore 資料庫。因此,由您決定這種方法是否最適合您。
請始終記住,您是根據查詢回傳的檔案數量付費的。
uj5u.com熱心網友回復:
還有一個問題。這看起來像我將使用的查詢:
admin
.firestore()
.collection("devices/{deviceID}/callbacks")
.{orderByCreateTime}
.limit(1)
.get()
.then((data) => {
let callback = [];
data.forEach((doc) => {
callback.push(doc.data());
});
return res.json(callback);
})
.catch((err) => console.error(err));
這樣對嗎?有沒有辦法在沒有設備 ID 的情況下執行此查詢?例如,通過設備檔案的某個欄位從設備集合中過濾設備?
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/329530.html
標籤:数据库 火力基地 谷歌云平台 谷歌云firestore
