簡體   English   中英

Objectify / GAE-一個具體的非規范化問題

[英]Objectify/GAE - a concrete denormalization issue

我正在使用Google App Engine和Objectify 3.1,並逐步了解非規范化和基於實體的用法設計實體,但是我仍然在某些方面苦苦掙扎。

我目前正在構建一個系統,用戶實體可以在其中參與游戲實體,並且需要能夠找到用戶參與的所有游戲。從我的角度來看,有兩種基本解決方案:

解決方案1)

在游戲上存儲用戶密鑰列表(participantKeys),並查找成員參與的游戲,如下所示:

List<Key<User>> userList = new ArrayList<Key<User>>();
userList.add(new Key<User>(User.class, myUserId));
Collection<Game> games = ofy().query(Game.class).filter("participantKeys in" , userList).list();

解決方案2)

除了將參與者列表存儲在游戲實體上之外,還存儲用戶已在用戶實體上參與的游戲的列表並查找如下游戲:

User myUser = userDao.getUser(myUserId);
Collection<Game> games = user.getParticipatedGameKeys();

一旦系統中有很多游戲,解決方案1就會變得很慢。

解決方案2可以更快地找到游戲,但是我需要在用戶加入和離開游戲時不斷更新列表。

一旦用戶長時間使用該系統,游戲列表也將變得很大。 我只想返回用戶當前正在參與的所有游戲,因此需要遍歷該列表並排除“歷史”游戲。

我想念一個更優雅的解決方案嗎? 以上兩種都不是很有吸引力。

任何幫助都將不勝感激!

編輯:

我考慮了很長時間的替代方案后,決定嘗試像Mikl建議的那樣..因此,很高興聽到一個非常相似的解決方案:-)

我創建了一個GameParticipation實體,其中包含游戲的鏈接,用戶的鏈接以及我需要能夠獲得的所有其他信息。

每次加入游戲時,我都會更新GameParticipation實體以反映游戲的當前狀態。 剩下游戲后,我刪除實體。 另外,更改游戲后,我會更新所有相關的GameParticipation實體。

我已經做了一些性能測試,它似乎工作得相當好!

您還可以擁有另一個我不知道如何稱呼它的實體(UserGame?),但是在該實體中,您將存儲游戲密鑰,用戶密鑰以及您想訪問的一些信息,例如用戶名稱,游戲名稱等。 然后,當用戶輸入游戲時,您將創建該實體。

使用此實體,您可以輕松檢索成員參與的游戲以及所有參與游戲的用戶。

這種方法的不便之處在於,如果更改用戶屬性或游戲屬性,則還需要更新存儲在USerGame實體中的信息(如userName)。

我不知道這是否是一個好的解決方案,但它應該可以工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM