사용자 클래스가있는 앱 엔진 프로젝트 (자바)가 있습니다. 저는 싼 친구 관계 시스템을 모델로 만들고 싶습니다. 각 사용자는 최대 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")
내가 모두 사용자 개체를로드하는 경우 빠른 검색을 수행하는 데 유용한 설정으로 저장,하지만 난 목록 및 설정 모두에 대해 생각에서 때 인출을 역 직렬화하기 데이터 저장소이므로 혜택이 무효화되었는지 확실하지 않습니다. 아마 도움이 될 것보다 더 많은 상처를 줄 것입니까?
은 친구들에게 실제 목록을 사용할 수 있습니다. 또는 심지어 더 나은 HashMap 그래서 평균 O (1) 조회하고 친구 목록 교차 작업을 향상시킬 수 있습니다. 최대 50 명의 친구가 있다고 가정 할 때 어떤 디자인을 선택하든 성능 문제가 발생할 수 있습니다. –
Adrian
좋은 지적, 그 옵션으로 내 질문을 업데이트했습니다. 필자는 데이터 스토어를 읽거나 지속 할 때 List 또는 Set 객체에 직렬화에 대한 불이익이 있다고 생각합니다. 목록을 사용하는 경우 쿼리를 완전히 피할 수 있는지 잘 모르겠습니다. 그것은 멋질 것이다. – user291701
긴 문자열 접근 방식을 사용해야하는 경우 접두사 트리를 사용하여 일반적인 친구를 찾는 속도를 높일 수 있습니다. 문제는 문자열 A의 문자열 B에서 하위 문자열을 찾습니다. – Adrian