Похожая на Twitter структура базы данных в Google App Engine

#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. Вы правы, в ней не будет учитываться историческое / ретроактивное следование. Я опубликовал пересмотренное решение, которое, я думаю, достигнет того, к чему вы стремитесь.