2012-03-06 14 views
0

我有一個MOdelA,它可能具有數百萬個條目或更多條目,ModelB可能不會超過數據存儲中的300000個條目。如何映射AppEngine數據存儲中兩個巨大集合之間的關係

我會爲MODELA(1左右 - 100秒)來創建主要新項目,每個MODELA的實體將屬於我需要能夠查詢所有的ModelB

描述的類別之一ModelA實體(按創建時間排序)屬於ModelB實體之一。

我的問題是我不知道如何映射關係。我不能只用父母,因爲在路上會有模型A可能屬於的MOdelC。

任何想法哇映射它在AppEngine?

在常規的SQL數據庫中,我將創建一個數據透視表,將ModelA映射到ModelB,稍後再將另一個數據透視表映射到ModelA到ModelC。然後我可以查詢數據透視表給我舉例說明屬於的所有ModelAs讓我們說ModelB id 5.

非常感謝您的任何建議!

UPDATE:

我想解釋我的問題是什麼,我試圖做一個例子的最佳方式。

可以說我有消息和城市實體。每個消息由用戶發佈關於城市(這些是我的ModelA和ModelB)。現在,用戶可以根據自己的喜好添加儘可能多的城市。

我必須設計數據模型,用戶只能看到他們在收藏中的城市(按日期排序)的消息。因此,藤原謙男提出的例子不起作用。

我會來查詢是這樣的:

db.GqlQuery("SELECT * FROM Message WHERE city IN (1, 2, 3, 4, ....)

這不能擴展,因爲用戶可以有很多的城市加入到收藏夾。並且因爲在AppEngine文檔中他們說:

包含不等於或IN運算符的單個查詢限制爲不超過30個子查詢。

,並在IN(...)每個條件的每個IN查詢生成多個==查詢

謝謝你的任何建議!

回答

1

您正在考慮關係數據庫模式。 Google數據存儲是一個基於地圖的數據庫,因此您想要對錶格取消規範化。這非常意味着您的模式將由您的應用程序代碼執行,而不是您的數據庫或模型聲明。

這篇文章解釋得好: http://highscalability.com/how-i-learned-stop-worrying-and-love-using-lot-disk-space-scale

+0

非常有趣的閱讀,非常感謝。不幸的是,它不能解決我的問題。請參閱我的問題的更新。謝謝! – Ralphz 2012-03-07 01:43:28

+0

我想你可能要存儲密鑰,如User.favoriteCities [City.key,City.key ...]列表。那麼你可能不得不一次爲30個城市的消息運行查詢。這是一個限制,但您可能能夠以某種方式運行多個異步請求來加速它。 – aglassman 2012-03-07 15:25:41

0

這聽起來像你想要做的是非常簡單的:

class ModelA(db.Model): 
    b = IntegerProperty() 
    creation_time = DateTimeProperty(auto_add_now = True) 

class ModelB(db.Model): 
    category_name = StringProperty() 

b_id = 5 

query = db.Query(ModelA) 
query.filter('b =', b_id) 
query.order('creation_time') 
rows = query.fetch(100) 
+0

感謝您花時間回答。我將更新添加到了我的問題中。你的榜樣可惜不解決我的問題:( – Ralphz 2012-03-07 01:44:26

+0

我認爲用'IN'運營商和多個查詢是與App Engine做到這一點的最好辦法。與數據存儲,基本上都需要預先計算集。在加方,東西這個簡單容易的memcache – 2012-03-07 19:58:09

+0

不幸的是,GAE文檔,它說的:含有不等於或在運營商的單一查詢限制爲不超過30子查詢 含義,如果用戶收藏夾列表是不再那麼。 30種元素的查詢將打破。 http://code.google.com/appengine/docs/python/datastore/queries.html#Overview – Ralphz 2012-03-07 23:25:33

0

這聽起來像你想要一個無主的雙向關係。你可以這樣做的一種方法是在每一邊創建一個鍵列表。如果您使用的是類似JPA的東西,基本上您會在用戶和城市之間建立ManyToMany關係。用戶和消息之間的OneToMany關係。城市與消息之間的一對多關係。

所以讓你在你的用戶是加入郵件列表上的基本查詢信息。然後,您可以通過從您的用戶那裏返回您最喜愛的城市列表,從這些您最喜愛的城市中的消息中拉出城市。

DataNucleus將提供無主的關係以及現在太。

http://datanucleus.blogspot.com/

相關問題