2

我正在爲Android製作一個即時通訊應用程序,並在後端使用Java和應用程序引擎。在處理海量數據時,在數據存儲中定義實體的正確方法是什麼?

要在後端存儲對話和消息,我有2個選項(如我所見)來存儲數據。

創建2個根實體: 對話(ID,消息ID)和消息(ID,「text」)。

OR

會話(ID)消息(會話實體的孩子)(ID, 「文本」)

雖然在技術上都可以工作,我不明白有關數據存儲的限制(如1對於某些實體,寫/秒),在查詢時擔心CPU開銷,並且可能有數百萬個消息根條目。我想我不確定是否需要祖先實體,或者最適合這樣的應用。

tl; dr構建這樣一個數據庫的最佳方式是什麼?

回答

1

不要使用祖先查詢除非你確定它們符合你的需求。這對我來說是數據存儲最令人困惑的部分,因爲起初,父母/孩子似乎是像樹一樣構建數據的好方法。
簡而言之,在寫入數據時必須具有中間一致性時使用它們。它對總體大小和每秒寫入數量有嚴重的限制。

不用擔心擁有數百萬的「根」實體。這正是數據存儲(以及一般的nosql)所擅長的。
所有的數據存儲查詢都是有效的,它甚至不會讓你運行一個沒有的(所以你必須事先添加所有需要的索引),因此不必擔心查詢性能,除非你不能用索引表示查詢。
在你的情況下,鑑於一個對話不應該是巨大的,用戶通常每秒輸入不超過5個條目,你可以使用祖先,你會在每個對話中獲得中立的一致性。
在這一點上,我認爲它的要求太寬泛了,但這應該指向正確的方式。

+0

這正是我所想的/擔心的。謝謝你對我的確認很清楚。 – Japes

+0

你編輯讓我困惑。我認爲數據存儲在acestral結構中只允許1次寫入/秒。所以在一個可以讓很多人快速發送消息的羣體對話中,這種對話是有限的。 我想如果結構和寫入速度有限制,爲什麼我不能在根中創建所有類型? – Japes

+0

但是每個獨特的對話是在兩個人之間對嗎?他們不會那麼快寫下來,如果他們在爆發時做出來,你可以用指數回退來處理 –

相關問題