2012-01-23 2 views
2

사용자 클래스가있는 앱 엔진 프로젝트 (자바)가 있습니다. 저는 싼 친구 관계 시스템을 모델로 만들고 싶습니다. 각 사용자는 최대 50 명의 친구를 가질 수 있습니다. 내가 좋아하는 우스꽝스러운 일을 생각하고 :저렴한 친구 관계 모델링

"친구"사용자가 친구 인 사용자 이름의 쉼표로 구분 된 목록입니다
class User { 
    String username; 
    Text friends; // "joe,mary,frank,pete" 
} 

. 여기에 지원하려는 작업을하고 나는 위로 할 거라고 방법 :


내 전체 친구 목록 가져 오기

다만, 사용자 개체를 검색 쉼표로 구분 된 목록을 되돌아 친구.


, 대상 이름이 문자열에 존재하는지하지 않을 경우, 확인, 내 사용자 개체를 가져옵니다 친구

추가 끝에 추가. 수정 된 사용자 객체를 데이터 저장소에 다시 저장합니다.


대상 이름이 문자열에 존재하는 경우, 검사가 않는 경우, 문자열에서 삭제, 내 사용자 개체를 가져옵니다 친구에게

을 삭제합니다. 수정 된 사용자 객체를 데이터 저장소에 다시 저장합니다.


는 사용자 이름이 서로의 사용자 개체에 나타나는지 확인, 모두 사용자 개체를 가져옵니다 두 명의 사용자가 상호 친구

된다. 친구의 전체 목록을 얻기


내 응용 프로그램을 위해 매우 중요하며, 별도의 엔티티 각 관계를 저장하는 사용자가 자신의 친구 목록을 것 아마 볼 필요가있을 때 데이터 저장소에서 각 개체를 가져 오는 (나에게 악몽과 같다 나를 파산). 나는 Text 속성으로부터의 간단한 읽기가 훨씬 더 가볍기를 바라고있다.

여기서 가장 큰 단점이있는 것처럼 보이지만 자주 발생하지는 않습니다. 두 개의 사용자 개체를 데이터 저장소에서 가져 와서 문자열 비교를 수행하면 성능이 현저하게 떨어지는 지 알 수 없습니다. 괜찮을까요? 데이터 저장소에서 개체를 만들고 삭제하는 것만으로도 기존 개체를 수정하는 것보다 많은 비용이 들었을 것입니다. 따라서 친구 작업 추가/삭제는이 방법이 더 좋을 수도 있습니다.

이 최적의 방법에 대해 생각해 보니 기꺼이 들려주십시오.

은 ------------- 당신에게

-------------------------- 업데이트 감사 -------- 아드리안의 주석 사항에 따라

을, 나는 또한 다음을 수행 할 수 : 나는 목록을 사용하는 경우

class User { 
    String username; 
    List<String> friends; 
     // or // 
    Set<String> friends; 
} 

그래서 내가 생각, 그 실체는 기본적으로 색인을 얻을 것이다.리스트가 실제로 어떤 엔티티를 가져 오지 않고도 일치를 얻기 위해 인덱싱된다는 사실을 알고 GQL 쿼리를 실행할 수 있는지는 잘 모르겠습니다. 뭔가 같이 : 여분의 시간은주의가 필요하다

SELECT COUNT FROM User WHERE 
    (username = "me" && friends = "bob") && 
    (username = "bob" && friends = "me") 

내가 모두 사용자 개체를로드하는 경우 빠른 검색을 수행하는 데 유용한 설정으로 저장,하지만 난 목록 및 설정 모두에 대해 생각에서 때 인출을 역 직렬화하기 데이터 저장소이므로 혜택이 무효화되었는지 확실하지 않습니다. 아마 도움이 될 것보다 더 많은 상처를 줄 것입니까?

+2

은 친구들에게 실제 목록 을 사용할 수 있습니다. 또는 심지어 더 나은 HashMap 그래서 평균 O (1) 조회하고 친구 목록 교차 작업을 향상시킬 수 있습니다. 최대 50 명의 친구가 있다고 가정 할 때 어떤 디자인을 선택하든 성능 문제가 발생할 수 있습니다. – Adrian

+0

좋은 지적, 그 옵션으로 내 질문을 업데이트했습니다. 필자는 데이터 스토어를 읽거나 지속 할 때 List 또는 Set 객체에 직렬화에 대한 불이익이 있다고 생각합니다. 목록을 사용하는 경우 쿼리를 완전히 피할 수 있는지 잘 모르겠습니다. 그것은 멋질 것이다. – user291701

+0

긴 문자열 접근 방식을 사용해야하는 경우 접두사 트리를 사용하여 일반적인 친구를 찾는 속도를 높일 수 있습니다. 문제는 문자열 A의 문자열 B에서 하위 문자열을 찾습니다. – Adrian

답변

1

List<String> friends;은 전문적인 용도로 사용하기에 좋은 솔루션입니다. 친구가 앱 또는 Google의 사용자 ID를 가지고 있다면 대신 해당 데이터 유형을 키 목록으로 사용할 수 있습니다.

+0

비슷한 경우에 목록을 사용하는 방법은 Google I/O 2009 http://www.youtube.com/에서 제공되는 "확장 가능한 복잡한 App on App Engine"프레젠테이션에서 설명합니다. 보기? v = AgaL6NGpkB8 – guigouz

1

실제로 두 가지 형식으로 데이터를 저장하는 것이 좋습니다. 먼저 사용자 이름 목록과 두 번째로 해당 사용자의 항목에 대한 데이터 저장소 키의 일치 목록입니다.

이렇게하면 사용자의 친구를 빠르게 표시하고 특정 친구를 찾아서 상호 관계를 확인할 수 있습니다. 특히 원래 사용자의 키에 대한 친구 키의 친구 목록을 문자열로 비교하는 것보다 훨씬 효율적입니다.

단점은 두 목록을 동기화 상태로 유지하는 것이지만 너무 힘들게 들리지 않는 작업 목록이 제공된다는 것입니다.