2014-05-12 51 views
0

如何在Google App Engine上實現與NDB的聚合或合成?取決於用例的最佳方式是什麼? 謝謝!如何在GAE上實現與NDB的組合/聚合

我試過使用重複屬性。在這個非常簡單的例子中,一個項目有一個標籤鍵列表(我選擇用這種方式編碼,而不是使用StructuredProperty,因爲許多Project對象可以共享標籤對象)。

class Project(ndb.Model): 
    name = ndb.StringProperty() 
    tags = ndb.KeyProperty(kind=Tag, repeated=True) 
    budget = ndb.FloatProperty() 
    date_begin = ndb.DateProperty(auto_now_add=True) 
    date_end = ndb.DateProperty(auto_now_add=True) 

    @classmethod 
    def all(cls): 
     return cls.query() 

    @classmethod 
    def addTags(cls, from_str): 
     tagname_list = from_str.split(',') 
     tag_list = [] 
     for tag in tagname_list: 
      tag_list.append(Tag.addTag(tag)) 
     cls.tags = tag_list 

-

編輯(2): 感謝。最後,我選擇創建一個代表兩個實體之間關係的新Model類「關係」。這更像是一個協會,我承認我的第一個設計沒有適應。

+0

我引用了這個問題(當然,這個,如果你有很多數據的聚合纔有效):http://stackoverflow.com/questions/13930573/ndb-modelling-one一對多的優點 - 重複性 - 與外鍵 – deweyredman

回答

0

它確實取決於用例。對於少量的項目,StructuredProperty和重複屬性可能是最合適的。

對於大量的實體,您將查看在密鑰中設置組合的父/祖代,並使KeyProperty指向多對一聚合中的主實體。

但是,選擇也將在很大程度上取決於實際使用模式。然後考慮效率踢in。

我可以建議的最好的是仔細考慮你打算如何使用這些關係,他們是多麼活躍(即他們不斷變化,添加,刪除),你需要看到所有成員大部分時間的關係,或者只是子集。這些考慮可能需要對方法進行調整。

+0

謝謝,我遵循你的建議,並調整了我的設計(參見我的編輯帖子瞭解詳情)。 – Hicham

1

另一種方法是使用BigQuery。起初,我們使用NDB,其中存儲單獨的非彙總記錄的RawModel以及存儲彙總值的AggregateModel

每次創建RawModel時都會更新AggregateModel,這會導致一些不一致問題。事後看來,正如Tim所建議的那樣,正確使用父/祖密鑰會起作用,但最終我們發現BigQuery更加愉快和直觀。

我們只是每天都運行cronjob,將RawModel推送到BigQuery,另一個使用從BigQuery提取的數據創建AggregateModel記錄。

+0

謝謝。但我認爲我暫時不需要使用BigQuery,因爲我沒有太多的數據可以聚合。另一方面,由於存在不確定數量的數據來聚合,我選擇實現一個Model類來描述兩個實體之間的關係,以便更快地進行搜索。事實上,我認爲尋找所有的Relation對象來檢查它的左邊的成員(在這個例子中是Tag)比查看所有的Projects更快,然後檢查這個對象中的每個聚集的標籤要快。 – Hicham