2012-11-07 101 views
0

我正在使用java和數據存儲工作我的第一個GAE項目。這是我第一次嘗試使用noSQL數據庫。像很多人一樣,我有理解使用正確模型的問題。到目前爲止,我已經發現了兩種模型,我需要幫助來選擇正確的模型。選擇正確的模型來存儲和查詢數據?

所有數據均以User.classWord.class兩個等級表示。

  • 用戶:夫婦串的用戶數據(用戶名,電子郵件......)

  • 字:兩個字符串

哪個更好:

  1. 在100個我需要的100個實體中搜索。例如,每個實體Word都具有字符串屬性owner,並且我查詢(owner = ‘John’)。

  2. User.class我添加屬性List<Word>和方法getWords()返回單詞列表。所以我在1000用戶查詢我需要的一個,然後調用方法如getWords(),返回List<Word>與我需要的100。

哪一個使用較少的資源?或者我用這個錯誤的方式?

回答

0

的答案是使用將Appstats,你可以找到:

AppStats

爲了使您的應用程序快,你需要知道:

是您的應用程序進行unnecessay RPC調用?是否應該緩存 數據而不是重複RPC調用來獲取相同的數據?如果在 並行而不是串行執行多個請求,您的應用程序性能會更好嗎 ?

運行一些測試,嘗試兩種方法,看看appstats說什麼。

但我想說你的選擇2)更好,因爲你不需要搜索數百萬個實體。但誰肯定知道?問題在於,「資源」在應用程序引擎中有十幾個不同的東西 - CPU,數據存儲讀取,數據存儲寫入等等等等等。

+0

可能是找出它的最佳途徑。謝謝。 – Beshev

0

對於您的User類,爲每個用戶設置一個唯一的ID(例如用戶名或電子郵件地址)。對於Word類,將每個Word類的父級設置爲特定用戶。

所以,如果你想查找特定用戶的單詞,你可以對屬於該特定用戶的所有單詞進行祖先查詢。

通過爲每個用戶設置一個ID,您可以通過ID獲取該用戶,而不是進行額外的查詢。

對祖先查詢更多信息:上標識 https://developers.google.com/appengine/docs/java/datastore/queries#Ancestor_Queries

更多信息: https://developers.google.com/appengine/docs/java/datastore/entities#Kinds_and_Identifiers

+0

我會檢查祖先的查詢。謝謝。 – Beshev

0

這真的取決於你使用的查詢。我假設你想找到給定所有者的所有單詞。

最有可能的是,2會更便宜,因爲您需要獲取用戶實體而不是運行查詢。

2將是你的一部分更多的工作,因爲你需要手動保持與Word

的把我的頭頂部的情況下同步的名單,我可以用#2想起2個問題,這可能適用於您或者可能不適用於:

答:如果您想查找所有給定某個詞的所有者,則需要保留索引的單詞列表。這會影響您的成本。如果你主要通過所有者查找單詞,並且很少通過單詞找到所有者,那麼以這種方式進行操作仍然是有意義的。但是,如果您的搜索模式翻轉並且您正在通過文字搜索所有者,這可能是錯誤的設計。如您所見,您需要根據您將要使用的查詢來設計模型。

B.實體被限制爲1MB,並且索引屬性的數量有限制(5000我認爲?)。這兩個將限制您可以存儲在列表中的單詞數量。確保你不會超過每個用戶的字數限制。方法1允許您爲每個用戶提供無限制的詞彙。

+0

我沒有想過這個限制。你爲我節省了很多問題。 – Beshev