2016-01-24 59 views
0

下面給出entity在谷歌應用程序引擎數據存儲區,是能夠更好地對reportingIds定義索引或定義僅具有personIdreportingIds字段一個單獨的實體?
根據我瞭解的文檔,定義索引會導致針對數據存儲區配額的操作數增加。GAE數據存儲索引VS正常化

以下是在GAE轉到實體。我的代碼需要經常掃描Person實體。它需要將其掃描限制爲具有至少一個報告人的Person實體。我看到兩種方法。

  • 通過指定過濾器來定義reportingIds和Query的索引。
  • 創建/更新PersonWithReporters實體,當有人獲得新的報告人時。
在第二種情況下,我的代碼需要遍歷 PersonWithReporters中的所有實體,並且不需要構造任何索引/查詢。我可以迭代使用密鑰,始終保證有最新的數據。考慮到數據存儲操作違反配額限制,不確定哪種方法是有益的。

type Person struct { 
    Id string //unique person id 
    //many other personal details, his personal settings etc 
    reportingIds []string //ids of the Person this guy manages 
} 

type PersonWithReporters struct { 
    Id string //Person managing reportees 
    reportingIds []string //ids of the Person this guy manages 
} 

回答

1

一個單獨的實體中的方法給你兩個優點。

  1. 正如您已經提到的,您不需要索引/查詢所有Person實體。

  2. 每當某人得到一個新的報告人時,您將創建一個新實體,該實體可能比更新具有許多其他屬性(其中某些屬性可能會被索引)的Person實體便宜得多。

您的方法與一個單獨的實體也不理想。當您爲具有多個值的屬性編制索引時,數據存儲會爲每個值創建一個索引條目。所以,當你添加報告人3號這個實體,你必須沒有屬性建立一個記者實體更新3個索引條目1.

相反,你可以優化你的數據模型更進一步!每次添加新的報告人時,都會創建此報告者實體,並將ID設置爲報告人的ID,並使其成爲代表本報告所報告人的Person實體的子實體。

現在,當你需要通過與別人對他們報告的所有人員進行迭代,你運行該記者實體的簡單查詢 - 無濾波器。該查詢可設置爲純鍵(沒有什麼比這個實體的關鍵無論如何,但純鍵查詢的處理方式不同 - 它們基本上都是免費的)。

對於此查詢返回的每個實體,您檢索其關鍵字,並且此關鍵字包含一個ID(它是報告人的ID)和一個父鍵,其中包括本報告人向其報告的人員的ID 。

+0

有兩種可能的缺點這種方法根據要求:由於它使用你必須注意每個實體組和第二限制1個寫祖先。雖然您可以查詢所有的人報告的人是無法查詢的人有人向因關鍵結構。如果這兩個不是問題,我也會採用這種方法。 – konqi

+0

也許有幾個人報告,但絕對沒有超過「1每秒」 :)至於第二個限制,如果這樣的查詢是必要的,ID爲索引屬性是必要的,而不是使其成爲一個子實體。儘管如此,讓每個「關係」由一個單獨的實體代表更有效率。 –

1

除非AppEngine上的圍棋數據存儲是它如何工作的Java或Python你不能原生指數的陣列非常不同 - 所以,選項1是出了問題,所以是選擇2

我建議第三個選項,這是定義這些實體,而不是一個數組單個實體的

type PersonWithReporters { 
    Id string // concatenate(managing_Person_id, separator, reporter_Person_id) to avoid id collisions 
    reportingId string; // indexed 
    managingId string; // probably indexed as well 
} 

您可以創建多個。你還在reportingId上添加一個索引。現在您可以在此實體上創建過濾器查詢,並且應該能夠檢索所需的信息。

我會更擔心的是性能,而不是太多的配額限制,他們是相當高的。只需實施它,看看它是如何工作的,以及配額是否是您最關心的問題。