2011-02-10 4 views
5

내 앱에서 사용자는 다른 사용자를 팔로우하고 소식을받는 사용자가 활동을 수행 할 때마다 업데이트를받을 수 있습니다.AppEngine의 데이터 저장소 모델 구조를 따릅니다 - 날짜순 팔로워 주문

나는이 방법으로 추적 관계를 저장 :

class User(db.Model): 
    ''' User details ''' 
    username = db.StringProperty() 

class Contacts(db.Model): 
    '''Store users contacts 
     parent= User (follower) 
     key_name= Users username (follower) 
     contacts = A list of keys of Users that a User follows ''' 
    contacts = db.ListProperty(db.Key) 
    last_updated = db.DateTimeProperty(auto_now=True) 

얻기 추종자, 그리고 사용자를 사용자가 따른다고 (추종자 &은 다음) :

'''Get Users that my_user follows''' 
my_user = User().all().fetch(1) 
contacts = Contacts.get_by_key_name(my_user.username).contacts 

''' get my_user followers - copied from an answer here on stackoverflow ''' 
follower_index = models.Contacts.all(keys_only=True).filter('contacts =',my_user) 
follower_keys = [f.parent() for f in follower_index] 
followers = db.get(follower_keys) 

그래서, my_user 추종자를 주문하려면 (나는 위의 모델에서 추적하지 않습니다) 따라하지만, 나는 그것을 할 수있는 가장 좋은 방법은 무엇인지 모르겠습니다.

1) 대신 연락처의 현재 구조 (db.Model)는 "다리"모델을 사용합니다 : 난 아직도 파악해야, 그러나

class Contacts(db.Model): 
    follower = db.ReferenceProperty(User) 
    following = db.ReferenceProperty(User) 
    date_created = db.DateTimeProperty(auto_now_add=True) 

을 여기에 내가 생각할 수있는 옵션이 있습니다 follower = user1, following = user2는 반복해서는 안됩니다. 내가 생각한 내 쿼리에 2 개의 필터를 적용하면 그렇게 할 수 있습니다.

2) 현재의 모델 구조를 유지하는 대신 연락처 키들의리스트 (db.Model)를 갖는의 튜플 저장 [user_key는 DATE_CREATED] 다음과 같이

class Contacts(db.Model): 
     '''Store users contacts 
      parent= User (follower) 
      key_name= Users username (follower) 
      contacts = A list of Tuples: User.key(), date_created ''' 
     contacts = db.StringListProperty() 
     last_updated = db.DateTimeProperty(auto_now=True) 

을 그러나, 이는 방법 나는 연락처 목록을 처리해야합니다 : 를 - 나는 사용자 키를 추출해야하고 StringList (각 문자열에서 DATE_CREATED) - 그럼 내가 만든 날짜에 의해 사용자 키 목록을 주문할 수 있습니다

3) 마지막 솔루션 (분명히 효율적이지 않음) : 원본 db 구조를 유지하고 사용자가 별도의 모드로 활동을 저장합니다. l - 각 follow 작업은 date_created 필드와 별도로 저장됩니다. 이 테이블은 날짜별로 사용자 팔로어 목록을 주문할 때만 사용하십시오.

Class FollowNewsFeed(db.Model): 
    ''' parent = a User follower''' 
    following = db.ReferenceProperty(User) 
    date_created = db.DateTimeProperty(auto_add_now=True) 

이 처리하는 가장 좋은 방법에 어떤 통찰력

매우 감사합니다 :)

을 다음과 같이 FollowNewsFeed()에 연락처 하나의()와 다른 - 물론 이것은 내가 두 데이터 저장소 둔다을 다하겠습니다 것을 의미한다

감사합니다.

내가보다는 자신의 목표에 대한 사용자의 목록 매핑 모델을 사용

답변

3

:

  1. 새로운 인스턴스를 삽입 또는 아마 빠른 거대한 목록을 수정하고 다시 저장보다 것이다 기존의 삭제를 . 또한 추적 된 크기가 커짐에 따라 목록 전체를 가져 오는 대신 목록의 하위 집합을 쿼리 할 수 ​​있습니다 (아래 이유 참조).

  2. 속성 공간이 추가로 필요하며 도로 목록을 재 설계하고 퍼지해야 할 필요가 없습니다.

  3. 목록이 (each item takes up a slot, up to 5000) 인 색인 제한에 대해 걱정할 필요가 없습니다.

불행하게도 당신은 아마 another limit much sooner에 충돌합니다 : 각 요소는 슬롯 [예를 소비하는 것을 의미합니다

A single query containing != or IN operators is limited to 30 sub-queries. 

합니다. in (1,2,3) = 3 슬롯]. 따라서 비교적 적은 양 (~ 30 명의 추종자)이라도 데이터베이스를 여러 번 방문하고 결과를 추가해야합니다.

사람들은 자신의 페이지를로드하고 타이밍에 수백 년이 걸릴 때 미쳐 가고 싶지 않다고 가정하면 사람들이 따라갈 수있는 사람의 수에 제한이 필요합니다. 따라 다니는 100 명의 사람들에게 좋은 4-5 여행이 필요하며 자바 스크립트를 통해 앱 또는 클라이언트 측에서 데이터를 정렬해야합니다.

+0

감사합니다. 흥미 롭습니다 - 하위 쿼리 제한을 생각하지 않았습니다. 그것은 제가 알아서해야 할 또 다른 문제입니다. 특히 언급 한대로 결과 집합을 날짜별로 정렬해야하기 때문에 사용자에게 표시하기 전에 모든 목록을 하나의 목록으로 정리해야합니다. – yasser

+0

개인적으로 나는 ajax를 사용하여 데이터를 가져온다. 지난 7 일간의 업데이트 또는 20 일간의 업데이트로 최대 30 일간의 여행으로 나눕니다. 그런 다음 자바 스크립트를 통해 결과를 표시하고 주문하십시오. 사람 프로필/메시지 목록에 아약스를 사용하지 않도록하십시오. 원하는 경우 Google에서 색인을 생성 할 수 있습니다. – Matt

+0

은 (1) 사용자 연락처 목록 가져 오기 (2) 목록을 20 개의 연락처 목록으로 분리하여 연락처 목록 가져 오기 (3) 연락처 목록에서 업데이트 가져 오기, 연락처 이름으로 필터링 및 date_created (last 7 일) (4) 결과 목록이 10 미만인 경우 다음 20 개의 연락처에서 결과를 가져와 목록에 여전히 업데이트가 10 개 미만인 경우 업데이트 목록에 추가합니다 (5), 다시 시작하고 날짜 간격을 확장합니다 (과거의 업데이트를 가져옵니다 14 일 대신에 ..).이 혼란 대신에, 어쩌면 나는 하위받은 편지함을 피하기 위해 모든받은 편지함에 모든 업데이트를 저장해야합니다. 나는 많은 글을 쓸 것입니다. -/ – yasser

관련 문제