2008-11-20 68 views
8

我想知道是否有人可能會提供一些有效方法來構建數據模型以完成下面描述的簡單系統的一些概念性建議。對於以非關係方式進行思考有點新,並且想要避免任何明顯的陷阱。我的理解是,一個基本的原則是「存儲便宜,不用擔心數據重複」,就像您在規範化的RDBMS中一樣。Google App Engine上的博客標記系統的數據建模建議

我想什麼型號是:

一個博客文章可以給出0-N個標籤。許多博客文章可以共享相同的標籤。當檢索數據時,希望允許檢索與標籤匹配的所有文章。在很多方面與在此使用的方法非常相似。

我的正常心態是創建標籤和博客文章之間的多對多關係。然而,我在GAE的背景下認爲,這將是昂貴的,雖然我已經看到它的例子。

也許使用包含每個標記作爲文章實體的一部分的ListProperty和第二個數據模型來跟蹤標記添加和刪除?這種方式不需要任何關係,並且ListProperty仍然允許任何列表元素匹配返回結果的查詢。

關於在GAE上最有效的方法來解決這個問題的任何建議?

回答

7

感謝你們兩位的建議。我已經實現(第一次迭代)如下。不知道這是否是最好的方法,但它的工作。

A類=文章。有一個StringListProperty可以查詢它的列表元素

B類=標籤。每個標籤一個實體也保持使用每個標籤的文章總數的運行計數。

對A的數據修改伴隨着B上的維護工作。認爲預計算的計數是在讀取繁重的環境中的好方法。

+0

只是我想建議的方法,除了我沒有找到時間。 :) – 2008-11-22 11:32:34

1

多對多聽起來很合理。也許你應該先試試看它是否真的很貴。

關於G.A.E的好消息它會告訴你什麼時候你使用了太多的循環。免費分析!

+0

我想很多一對多太多,但即使在谷歌,但在所有最必要的情況下,警告不要這個文件。好的建議考慮了分析,我想我會嘗試使用不同的方法進行一些測試,並將結果報告回來。 – Matty 2008-11-20 12:03:55

1

一種可能的方式是Expando,在那裏你會添加一個標籤,如:

setattr(entity, 'tag_'+tag_name, True) 

然後,你可以查詢所有實體類似這樣的標記:

def get_all_with_tag(model_class, tag): 
    return model_class.all().filter('tag_%s =' % tag, True) 

當然你有清理你的標籤,使其成爲正確的Python標識符。我沒有嘗試過,所以我不確定它是否是一個很好的解決方案。

+1

如果標籤名稱不必是英文? – 2010-09-14 09:43:07

2

預先計算的計數是 不僅 實際 ,但也是必要的,因爲count()函數返回最大值1000 。如果寫爭用可能是一個問題,請確保查看分片計數器示例。

http://code.google.com/appengine/articles/sharding_counters.html

+0

在最新版本的gae sdk中,count()函數沒有最大限制:http://code.google.com/appengine/docs/python/datastore/queryclass.html#Query_count – 2011-01-18 10:13:53

相關問題