12

說我有一個圖片庫和一張圖片可能有100k +粉絲。哪個ndb設計更高效?GAE ndb設計,性能和重複性能的使用

class picture(ndb.model): 
    fanIds = ndb.StringProperty(repeated=True) 
    ... [other picture properties] 

class picture(ndb.model): 
    ... [other picture properties] 

class fan(ndb.model): 
    pictureId = StringProperty() 
    fanId = StringProperty() 

是否有您可以添加到NDB反覆性,是否有與在重複的特性儲存大量項目的任何性能損失的項目數的限制?如果使用重複屬性的效率較低,那麼它們的用途是什麼?

+1

與答案無關,但我建議你遵循約定..類名稱'CamelCase'和屬性名'lower_case_underscore' .. – Lipis 2013-03-13 08:53:57

+0

也爲'pictureId'使用'ndb.KeyProperty(kind = picture )',因爲你在當前模型中有''和'fanId = ndb.KeyProperty(kind = fan,repeated = True)'而不是'StringProperty'來更好地處理實體。 – Lipis 2013-03-13 08:56:54

回答

31

如果您的值超過100-1000,請勿使用重複屬性。 (1000可能已經在推動它。)它們不是爲這種使用而設計的。

+0

從另一個問題跳到這個答案:(stackoverflow.com/questions/26740505)。一個人不應該使用超過10個元素的重複屬性?所以關係應該通過重複鍵來避免。正確? – EsseTi 2014-11-07 08:23:43

+0

@Guido我們應該如何使用這種類型的批量數據存儲? – Napolean 2015-01-31 08:42:48

+0

@Napolean我認爲[NDB PickleProperty](https://cloud.google.com/appengine/docs/python/ndb/properties#types)是你正在尋找的。 – cjlallana 2015-04-21 13:49:57

5

通常v1會便宜得多。

在讀寫成本方面,您按實體提取/寫入支付,所以您希望減少實體的數量。版本1將會更便宜。如果您每次抓取圖片時抓取每個粉絲,價格便宜得多。

但是,每個實體都被限制爲1MB。如果你有100k +的粉絲,你可以根據粉絲的大小達到這個限制。這不包括你的其他圖片數據,所以你可以吹出1MB的限制。你將不得不添加一些更復雜的代碼來處理溢出情況。

大型實體比小實體需要更長的時間獲取。如果你打算一直提取所有的粉絲,v1會更好。如果你只是想在任何一點獲得5個粉絲,v2可能會更快(只有可能)。另一方面,如果你試圖拉動10萬個粉絲實體......那會永遠消失。