app-engine (python) Моделирование отношений, я делаю это неправильно? - PullRequest
0 голосов
/ 11 февраля 2010

Используя следующие модели, я пытаюсь найти способ создания своего рода новостной ленты, чтобы при входе пользователя в систему ему отображался список предстоящих событий для баров, которым он решил следовать. Смогу ли я запросить что-то вроде «SELECT * FROM Barevent WHERE parent_bar IN UserprofileInstance.following»? Если это так, будет ли это эффективно?

class Barprofile(db.Model):
    b_user          = db.UserProperty()
    created         = db.DateTimeProperty(auto_now_add=True)
    barname         = db.StringProperty()
    address         = db.PostalAddressProperty()
    zipcode         = db.StringProperty()

class Barevent(db.Model):
    created         = db.DateTimeProperty(auto_now_add=True)
    when            = db.DateProperty()
    starttime       = db.TimeProperty()
    endtime         = db.TimeProperty()
    description     = db.StringProperty(multiline=True)
    parent_bar      = db.ReferenceProperty(Barprofile, collection_name='bar_events')

class Userprofile(db.Model):
    b_user          = db.UserProperty()
    following       = db.ListProperty(db.Key)

Ответы [ 3 ]

1 голос
/ 11 февраля 2010

Ваша модель и ваш запрос должны работать нормально, и это не будет неэффективно. Единственное, что вы должны иметь в виду, это то, что если объекты Barprofile удаляются, вы можете вручную удалить их ключи из свойства после каждого Userprofile. Наличие потерянной ссылки Barprofile не нарушит запрос, но если вы когда-либо будете использовать этот список для других целей (например, для отображения пользователю, на какие бары он подписан), вы получите ошибку, если попытаетесь выполнить запрос по этому ключ.

1 голос
/ 12 февраля 2010

Структура, которую вы описываете, будет работать, но имейте в виду, что оператор 'IN' требует выполнения одного запроса для каждого элемента в списке - так что это может привести к большому количеству запросов.

Однако, с чем вы сталкиваетесь, это проблема «разброса», похожая на Twitter, поэтому у вас нет большого выбора - вы либо собираете вещи во время чтения, например, либо транслируете их всем слушающим пользователям во время обновления.

0 голосов
/ 11 февраля 2010

Есть много способов сделать запросы GAE, но я не понимаю, почему ваши не будут работать. Если у вас был определенный Barprofile (B), то я думаю, что вы могли бы (на Python) сделать;

   query = db.GqlQuery("SELECT * FROM Barevent WHERE parent_bar = :1,
                            B.b_user)
   day = query.get()

Но я не совсем уверен, почему у вас есть и Userprofile, и Barprofile (поэтому я думаю, что вы захотите пересмотреть эти три).

Как правило, вам не нужно (или даже не нужно) нормализовать данные в GAE, как вы привыкли делать в традиционных средах СУБД. Больше нет особого преимущества в нормализации ваших данных таким образом, то есть вместо того, чтобы вносить их в вашу БД, чтобы обеспечить согласованность, вы делаете это на уровне приложения.

...