Ключи кэша хранилища данных GAE против фильтра
Допустим, у вас есть такая сущность.
postid=db.StringProperty()
comment=db.StringProperty()
для хранения комментариев к определенному сообщению, идентифицированному идентификатором сообщения. Комментарии могут поразить миллиарды записей. Теперь, если вы хотите получить все комментарии, относящиеся к определенной записи, вы можете сделать,
query=Comment.all()
query.filter('postid = ','id').
Или вместо этого вы можете определить пост как
class Post(db.Model)
commentids=db.StringListProperty()#store list of comment ids
Таким образом, вы можете напрямую получить комментарий, выполнив
comment=Comment.get_by_key_name('commentkey')
В конечном счете (когда комментарии достигают отметки в миллионы или даже миллиарды), какой из них более эффективен. Другими словами, какой из них более уместен.
2 ответа
Если вы планируете получать миллиарды комментариев, рассмотрите возможность использования новейшего API NDB, который, помимо прочего, поддерживает автоматическое кэширование.
Вместо того, чтобы фильтровать их postid
вы, вероятно, должны использовать родителя для вашего Comment
юридическое лицо. Вот пример (с использованием DB, но он очень похож на NDB):
Если у вас есть модель, как эта:
class Post(db.Model):
desc = db.StringProperty()
class Comment(db.Model):
desc = db.TextProperty()
Вы можете создавать сообщения и комментарии, такие как:
post_db = Post(desc='Hello World')
post_db.put()
comment_db = Comment(parent=post_db, desc='Nice post')
comment_db.put()
И, наконец, если вы хотите получить все комментарии от конкретного post_db
юридическое лицо:
comment_dbs = Comment.all().ancestor(post_db)
Размер объектов ограничен 1 МБ. Кроме того, сущность может иметь до 5000 записей индекса, так что если ваш commentids
индексируется тогда максимальный размер будет 5000 записей.
Таким образом, второй вариант не подойдет для миллионов комментариев (я никогда не видел сайт с миллионом комментариев на пост, но Reddit получает более 5 тыс. За популярные посты).
Кроме того, вам, вероятно, потребуется способ составления списка комментариев в прогрессивном режиме (разбиение на страницы, последовательная прокрутка). В этом случае первый вариант с помощью запроса будет лучше, так как вы можете последовательно выводить комментарии с помощью курсоров, а также вы можете сортировать свойства по различным критериям (время, голоса и т. Д.).