2017-11-30 16 views
0

Objectify 코딩에 익숙하지 않아 다 대다 관계 쿼리의 문제를 해결하려면 도움이 필요합니다.Google App Engine Objectify 5.1.21 - 다 대다 관계 쿼리

@Entity 
public class User { 
    @Id private String login; 
    private String password; 
    @Index private String name; 
    @Index private String firstName; 
    @Index private byte right; 
} 

@Entity 
public class Installation { 
    @Id private long id; 
    @Index private long clientId; 
    @Index private String name; 
    private String address1; 
    private String address2; 
    @Index private String postCode; 
    private String city; 
    @Index private String countryCode; 
    @Index private int status; 
} 

사용자는 여러 설치에 액세스 할 수 있으며 설치가 여러 사용자를 가질 수 있습니다 : 다 대다 관계

나는 사용자 및 설치라는 이름의이 개 단체가 있습니다. 이 엔티티를 매핑하고 싶지만 사용자로드시 시스템 적으로 설치를로드하고 싶지는 않습니다.

@Entity 
public class InstallUser { 
    @Id private Long id; 
    @Index Key<User> userKey; 
    @Index Key<Installation> instalKey; 

    public void setLink(User user, Installation instal){ 
     //initialize 
     this.userKey = Key.create(User.class, user.getLogin()); 
     this.instalKey = Key.create(Installation.class, instal.getId()); 
    } 
} 

은 당신이 쿼리를 작성하기위한 나를 도울 수 : 그래서, 매핑 사용자 및 설치에 대한 엔티티 생성

  1. 부하 자신의 로그인 (@id)에 의해 식별되는 사용자의 모든 설치;
  2. 해당 ID (@id)로 식별되는 설치에 액세스 할 수있는 모든 사용자를로드합니다.
  3. 로그인 (@id)으로 식별되고 그의 오른쪽 (예 : 오른쪽 = 2)으로 필터링 된 사용자의 모든 설치를로드합니다.

도움을 주셔서 감사합니다.

답변

0

데이터 저장소는 조인을 수행하지 않지만 조인은 계속 수행 할 수 있습니다. 쿼리 계획자는이 작업을 수행 할 수 있습니다. 그래서 RDBMS가 할 일을하십시오. 예를 들어,이 것 ("자신의 로그인으로 식별되는 사용자의 모든 설치를로드") # 1을 수행 할 수 있습니다 :

  • 해당 사용자와 관련된 모든 InstallUser의 찾기

    1. 그 사용자에 대한 Key<User>을 확인
    2. 모든 관련 도구를 사용하여 설치를 일괄 적으로로드하십시오.

    당신은 Ref<?>의 대신 InstallUser에서 Key<?>의를 사용하여 자동으로 Installation를 가져 오기 위해 @Load 주석을 사용하여 약간 더 영리 할 수있다.

    이 데이터를 구조화하는 데는 몇 가지 다른 방법이 있습니다. 관계의 유형에 따라 별도의 관계 엔티티 대신 User 또는 Installation의 목록 특성을 사용할 수 있습니다. 그러나 당신은 올바른 길을 가고 있습니다.

  • +0

    답장을 보내 주셔서 감사합니다. 올바르게 이해하면 쿼리 # 1과 # 2에 대해 목록을로드하기 위해 Objectify에 2 개의 쿼리를 실행해야합니다. 키를 로드 한 다음 키 에서 목록을로드하십시오. 1 개의 쿼리 만 작성할 수 있습니까? 쿼리 # 3에 대한 해결책이 있습니까? Ref 이 더 현명하다고하셨습니다. 당신은 발전 할 수 있었습니까? –

    +0

    데이터 저장소가 조인을 수행하지 않으므로 단일 쿼리로 처리 할 수 ​​없습니다. 데이터베이스 쿼리 플래너의 동작을 모방해야합니다. # 3의 경우 데이터를 비정규 화하는 것이 가장 쉽다는 것을 알 수 있습니다. 즉, 설치의 일부 데이터 ('right')를'InstallUser'로 가져 와서 필터링 할 수 있습니다. 데이터 저장소에는 몇 가지 단점이 있습니다. SQL이나 조인 또는 집계는 없지만 유지 보수가 필요없는 무한 확장 성 데이터베이스를 얻게됩니다. 이 거래가 가치가 있는지 여부는 앱 간 차이가 있습니다. – stickfigure

    +0

    @stickfigure '@ Load' 주석은'Key '필드에도 적용되지 않습니까? – markvgti