2010-11-22 42 views
3

我想確定在GAE的數據存儲上創建可投票實體的最有效方法。我想向用戶顯示控制權來投票支持此實體或表示他們已投票支持的圖標;即,我問「有用戶對此實體投票?」讓我們說,我們有一個問題實體,用戶可能會投票。這是我在想什麼:建模投票在GAE

  1. 查詢我的問題實體。這些問題已經有了預先確定的排序,我將對其進行排序。
  2. 使用作爲Question實體的子元素的關係索引實體。使用與#1相同的過濾器查詢所有問題,其中我的用戶是此關係索引實體的成員。
  3. 通過將每個找到的成員的hasVoted屬性設置爲true,將#2的結果合併到#1中。

這是我能想到的最乾淨的方式,但它仍然需要兩個查詢。我沒有爲每個用戶創建重複的Question實體,因爲這會導致太多的數據重複。這個解決方案是處理投票和問題之間的m2m關係之間的有效聯繫的一個好方法,還是我關聯性地思考?

回答

0

爲了避免第二個查詢,您可以存儲所有用戶在單個實體投票的問題。該實體可以是用戶模型的一部分,或與用戶實體存在一對一的關係。

然後,您可以根據需要加載此信息(並將其存儲到memcache以避免數據存儲加載),以便您可以快速檢查用戶是否已經對問題投了票(大部分時間不進行第二次查詢)。

如果用戶可以對很多問題進行投票,那麼您可能不得不延長這個想法。這裏是你怎麼可能去的簡單方案的輪廓(不具有完整功能):

class UserVotes(db.Model): 
    # key = key_name or ID of the corresponding user entity 

    # if all of your question entities have IDs, then voted_on can be a list of 
    # integers; otherwise it can be a list of strings (key_name values) 
    voted_on = db.ListProperty(int, indexed=False) 

# in your request handler ... 
questions = ... 
voted_on = memcache.get('voted-on:%s' % user_id) 
if voted_on is None: 
    voted_on = UserVotes.get_by_id(user_id) # should do get_or_insert() instead 
    memcache.set(...) 
for q in questions: 
    q.has_voted = q.key().id() in voted_on 
+1

如果voteed_on = [],而不是`coted_on:`爲真,我會用`如果voted_on是None:'替換`if not voted_on:`。 – 2010-11-23 02:35:34

+0

好點弗拉基米爾;我調整了代碼 - 謝謝! – 2010-11-23 03:59:24

3

而不是使用一個關係索引,只是有一個子實體爲對問題投票每個用戶。使子實體的key_name成爲用戶的ID。然後,爲了確定用戶y是否對ID爲x的問題投了票,只需獲取密鑰(問題:x/Vote:y)。您也可以對其進行批處理,以便爲多個問題或用戶提取多個實體。

2

我會看看Overheard Google App Engine示例應用程序。

我們的基本模式將有 行情,其中包含了 報價字符串,並投票,其中包含 爲 特定用戶的用戶名和投票。

有一個Google article關於它和here你可以找到來源。