在我的應用中,用戶可以關注其他用戶,並在他們關注的人員執行活動時獲取更新。關注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 )最後的解決方案(顯然不高效):保持原始數據庫結構,並將用戶關注活動存儲在單獨的模式中l - 每個關注操作都會與date_created字段分開存儲。只能使用此表格才能按日期排列用戶關注者列表。當然,這意味着我會做兩個數據存儲看跌期權 - 一個聯繫人(),另一個FollowNewsFeed()如下:
Class FollowNewsFeed(db.Model):
''' parent = a User follower'''
following = db.ReferenceProperty(User)
date_created = db.DateTimeProperty(auto_add_now=True)
上解決這個問題的最好辦法任何見解的高度讚賞:)
謝謝!
謝謝!有趣的 - 我沒有想到子查詢的限制。這是我必須要處理的另一個問題,特別是如您所提及的,我需要按日期對結果集進行排序 - 所以我需要在將它顯示給用戶之前將其全部放入一個列表中。 – yasser 2011-02-11 01:52:19