2012-08-25 50 views
0

假設我有一個Club實體和一個User實體。 A Club有一個成員列表。Google App引擎列表ReferenceProperties與字符串

現在說我想獲得用戶所屬的所有Clubs。有兩種方法可以做到這一點,每個參與成員的名單:

  1. 列表可以是字符串這是成員的電子郵件地址列表。當我想得到俱樂部用戶是一部分,我會做clubQuery.filter('emailAddresses =', userEmail)

  2. 該列表可以是ReferenceProperties的列表,其中每個項目是對用戶實體的引用。所以我會做clubQuery.filter('userReferences =', user_key)

哪一個會是更好的選擇,爲什麼?或者兩者之間真的沒有區別?

+0

用戶的電子郵件地址可以更改嗎?獲取成員的電子郵件地址(沒有任何其他信息)而不必執行數據存儲查找有用嗎?你是否需要查看俱樂部的所有成員?用戶實體的關鍵名稱是他們的電子郵件地址嗎? –

+0

嗯我沒有想過用戶的電子郵件更改的情況。也許在未來的某個時候,但現在沒有。不,我不認爲只有用戶的電子郵件會有用。如果我需要看俱樂部的所有成員,我可以找回那個俱樂部並獲得其用戶。是的,密鑰的名稱是他們的電子郵件地址.. – Snowman

+0

在這種情況下,我會建議使用密鑰 - 沒有理由不要。 –

回答

0

根據電子郵件的平均長度,您可以通過存儲電子郵件來節省一些存儲空間,但它們的密鑰可能會更長。或不。

當您通過鍵執行數據存儲區獲取時,您可以擁有強大一致的讀取,而不是從篩選器操作獲得的最終一致結果。如果您存儲了密鑰,則可以選擇在必要時執行此操作。

這聽起來像你有第三個選擇,它是使用電子郵件地址作爲關鍵;你會以這種方式獲得兩全其美的好處。

編輯我想我並沒有真的回答你的問題。這是一個更好的答案。

  • 選項1可以節省您的存儲空間,從而節省一點成本。它雖然很小,可能微不足道。
  • 選項2使您可以更輕鬆地在俱樂部端編寫代碼,因爲您可以自動解引用。
  • 對於如何查詢用戶所屬的俱樂部,這並沒有太大區別。
  • 如果您將我對電子郵件的建議用作密鑰,它可能允許您以一致的方式獲取用戶實體,這是您沒有要求的好處。
+0

你能詳細說一下第三個選項嗎?使用電子郵件地址作爲密鑰在哪裏? – Snowman

+0

創建用戶對象時,請使用電子郵件地址作爲鍵:u = User(key_name =「[email protected]」)。稍後通過電子郵件地址重新創建密鑰很容易。請參閱https://developers.google.com/appengine/docs/python/datastore/keyclass。 – dragonx

+0

雅,但這如何幫助找到一個用戶屬於哪個俱樂部? – Snowman