2015-06-30 15 views
0

考慮這兩種情況在App Engine數據存儲設計:當XG(跨組)事務可以完成同樣的工作時,爲什麼要選擇實體組事務?

  1. A是B的祖先,我們使用一個事務來更新這個實體組。
  2. A和B都沒有祖先。我們使用XG事務來更新這兩個實體。

我可以在2的情況下看到這些優點:

  • 就像1的情況下,實現了原子性。
  • 如果我給A和B的字符串或整數ID,鑑於它們是不同的種類,我可以查找其中一個,當我有另一個。這對於在情況1中由父母或子女查找等同。
  • 因爲實體不在組中,所以它們不受寫入吞吐量限制的影響。

以上幾點是否正確?案例1何時和爲什麼要使用案例2?

回答

2

XG事務只能跨越25個不同的實體組,所以對一次批處理中可以進行多次更改的次數有限制。另外使用祖先允許您構建對祖先組內數據的查詢。

考慮一個簡單的微博客網站的例子,用戶可以發佈帖子並查看來自其他用戶的帖子。你的主頁顯示所有用戶的最新帖子,所以做一個最終一致的查詢來獲取這些數據是好的(我們可以忍受這裏的一些陳舊)。但是,當用戶發佈帖子時,他們應該始終在帖子中看到該帖子。

如果您將每篇文章存儲在自己的EG中,則對用戶帖子的查詢可能如下所示:SELECT * FROM Post WHERE author = $current_user。但是,這最終是一致的。因此,用戶可以發佈帖子,然後不會在其Feed中顯示。相反,我們可以利用EG並使每個Post成爲創建它的User的孩子。然後,我們可以查詢單個用戶的帖子:SELECT * FROM Post WHERE __key__ HAS ANCESTOR KEY('User', $current_user)

在這種情況下,用戶將被限制在創建每秒1篇文章,但是這與良好比對一個自然邊界 - 用戶被需要多長時間打字後,在這一點上的限制。

+0

在您的示例中,用戶最終將擁有數以萬計的帖子,從而使實體組非常大。這不是問題嗎?另外,在我的例子中,A和B共享相同的id但是不同的類型,是不是很滿意? – ali

+0

沒關係,如果用戶有很多帖子(顯然你應該設置一個限制並使用分頁來實際顯示它們)。 對不起,我的意思並不是暗示交易沒有很強的一致性 - 無論是否在交易中使用,Gets和Puts總是非常一致。 –

相關問題