2012-04-15 81 views
0

我希望儘可能高效,並且計劃正確。由於在使用Google App Engine時讀寫成本非常重要,因此我想確保將這些成本降至最低。我不瞭解數據存儲區中的「關鍵」概念。我想知道的是,通過密鑰獲取實體,比考慮我知道它是什麼,而不是通過某種過濾器獲取更有效率?通過Google API中的過濾器獲取關鍵字和獲取內容

假設我有一個名爲User的模型,並且用戶有一個commentIds數組(列表)。現在我想獲得所有這個用戶的評論。我有兩種選擇:

  1. 用戶的commentId數組是一個鍵數組,其中每個鍵都是Comment實體的鍵。由於我擁有所有密鑰,因此我只能通過密鑰獲取所有註釋。

  2. 用戶的commentId數組是我自定義的標識符,在這種情況下,我們只是說他們是自動遞增常規整數,並且數據存儲區中的每個註釋都有唯一的commentIntegerId。所以現在如果我想要得到所有的評論,我會根據所有帶ID的註釋在我的數組中進行過濾提取。

哪個實現會更有效率,爲什麼?

+0

您是否考慮過第三個選項:用戶密鑰是該用戶的評論鍵的父代(祖先)? – alex 2012-04-15 18:16:05

+0

您能詳細說明一下嗎.. – Snowman 2012-04-15 18:23:04

+0

意思是,您可以簡單地使用數據存儲結構,而不是在用戶模型中使用屬性列表:註釋鍵具有父鍵和用戶鍵。所以,以後,當你想要獲得用戶的所有評論時,你可以'Comment.query(ancestor = user_key)'(在Python,NDB中)或'ds.prepare(新的Query(「Comment」,userKey))'(Java)。換句話說,您不保留任何額外的實體屬性來保存註釋鍵列表。 – alex 2012-04-15 18:33:31

回答

4
  1. 通過密鑰導入是從數據存儲,因爲它最直接的操作得到一個實體的最快方法,並不需要去通索引查找。
  2. 每次您創建一個條目(除非您指定了key_name),應用引擎將生成一個唯一的(每個父實體)數字ID,您應該將其用作註釋的ID。
+0

你有什麼機會可以闡述第1點?爲什麼它是最快的方式? – Snowman 2012-04-15 18:50:12

+0

@mohabitar:一個實用的答案會指向你[應用程序引擎系統狀態](http://code.google.com/status/appengine/detail/hr-datastore/2012/04/15#ae-trust-detail- hr-datastore-get-latency),單個數據存儲獲取(通過密鑰獲取)需要約30ms,而單個查詢需要約90ms。 – 2012-04-15 19:43:51

+0

@IbrahimArief btw注意到HR數據存儲獲得時間adv約爲30ms,而(舊的和「壞」)MS數據存儲約15ms。 – 2012-04-15 20:45:09

1

你應該根據使用模式設計一個NoSQL數據庫(= GAE數據存儲):

如果您需要同時獲得所有用戶的評論和永遠需要根據某些條件得到一個或一些人的(例如查詢它們),而不是最有效的方式,就速度和成本而言,將所有註釋序列化爲實體內的二進制blob(或將其保存到Blobstore)。

但我想這不是這種情況,因爲評論通常與用戶和帖子綁定,對嗎?在這種情況下,上述建議將不可行。

要回答你題目的問題:get由關鍵總是比query更快的屬性,因爲查詢第一次通過索引滿足屬性條件,它得到的關鍵,然後它與get這個關鍵。