2012-06-26 5 views
1

저는 Google App Engine 및 Objectify 3.1을 사용하고 천천히 비정규 화에 대해 배우고 그 사용법에 따라 엔티티를 디자인하지만 아직 일부 문제로 어려움을 겪고 있습니다.Objectify/GAE - 구체적인 비정규 화 문제

:.

나는 현재 사용자 엔티티는 게임 엔티티에 참여하고 두 가지 기본 솔루션있어, 사용자가에서 내가 볼때 참여하는 모든 게임을 찾을 수 있어야합니다 수있는 시스템을 구축하고있어

해결 방법 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 엔티티를 업데이트합니다.

성능 테스트를 조금 해봤지만 제대로 작동하는 것 같습니다!

답변

0

내가 어떻게 호출 할 수 있는지 모르겠지만 (UserGame?)이 엔티티에서 게임 키, 사용자 키 및 액세스하려는 정보를 저장합니다. 예를 들어 사용자 이름, 게임 이름 등. 그런 다음 사용자가 게임을 입력하면이 엔티티가 생성됩니다.

이 엔티티를 사용하면 회원이 참여하는 게임과 게임에 참여하는 모든 사용자를 쉽게 검색 할 수 있습니다.

이 방법에 불편한 점은 사용자 속성이나 게임 속성이 변경되면 userName과 같은 USerGame 엔터티에 저장 한 정보도 업데이트해야한다는 것입니다.

좋은 해결책인지 잘 모르겠지만 작동해야합니다.

+0

의견을 보내 주셔서 감사합니다. Mikl - 좋은 아이디어! – Javasmurf