#google-app-engine #gql #gqlquery
#google-app-engine #gql #gqlquery
Вопрос:
Я пытаюсь создать сайт, который очень похож на Twitter. Пользователи смогут публиковать сообщения. И пользователи смогут «подписываться» друг на друга. На главной странице они видят сообщения от пользователей, на которых они подписаны, отсортированные по времени.
Как мне приступить к созданию моделей appengine для этого?
В традиционной реляционной БД, я думаю, это было бы что-то вроде этого:
«Пользователь» базы данных:
- ID
- Имя пользователя
База данных «следует»:
- идентификатор пользователя
- follow_id
База данных «сообщений»:
- идентификатор пользователя
- Сообщение
И запрос будет выглядеть примерно так:
SELECT * FROM messages m, follows f WHERE m.user_id = f.follow_id AND f.user_id = current_user_id
Я думаю, мне было ясно с приведенным выше примером. Как мне воспроизвести это в Google App Engine?
Ответ №1:
Некоторое время назад Бретт Слаткин опубликовал полезную презентацию в Google I / O, в которой описывается создание масштабируемого приложения для микроблогов, подобного Twitter, и подробно рассматривается именно этот вопрос: http://www.google.com/events/io/2009/sessions/BuildingScalableComplexApps.html
Ответ №2:
ИСПРАВЛЕНО:
class AppUser(db.Model):
user_id = db.UserProperty()
username = db.StringProperty()
following = db.ListProperty(db.Key) # list of AppUser keys
class Message(db.Model):
sender = db.ReferenceProperty(AppUser)
body = db.TextProperty()
Затем вы должны запросить результаты в два этапа:
message_list = []
for followed_user in current_user.following:
subresult = db.GqlQuery("SELECT __key__ FROM Message WHERE sender = :1", followed_user)
message_list.extend(subresult)
results = Message.get(message_list)
(при этом ‘current_user’ является объектом ‘AppUser’, соответствующим вашему активному пользователю)
Комментарии:
1. Но это не сработало бы в этом сценарии: — 1) Пользователь A публикует сообщение, 2) Пользователь B следует за пользователем A, 3) Теперь пользователь B не сможет увидеть сообщение, опубликованное в (1).. Кроме того, 1) Пользователь A следует за пользователем B, 2) Пользователь B публикует сообщение, 3) Пользователь A не следует за пользователем B, 4) Пользователь A все равно увидит сообщение, опубликованное в (2).. Я прав?
2. Вы правы, в ней не будет учитываться историческое / ретроактивное следование. Я опубликовал пересмотренное решение, которое, я думаю, достигнет того, к чему вы стремитесь.