Многие со многими, используя ListProperty Google App Engine Python
Я создаю приложение для Facebook, которому нужен доступ к странице Facebook пользователя. Сценарий выглядит так:
Пользователь (администратор) может иметь несколько страниц, а одна страница может иметь несколько администраторов. И на каждой странице может быть несколько постов. Я видел документацию движка приложения Google (Моделирование отношений между сущностями). Они использовали ListProperty для отношения "многие ко многим" и свойство ссылки для отношения "Один ко многим".
Структура классов, как я думаю, как
class User(db.Model):
id = db.StringProperty(required=True)
name = db.StringProperty(required=True)
profile_url = db.StringProperty(required=True)
access_token = db.StringProperty(required=True)
pages = db.ListProperty(db.Key)
class Page(db.Model):
id = db.StringProperty()
name = db.StringProperty()
page_access_token = db.TextProperty()
users = db.ListProperty(db.Key)
class Post(db.Model):
page = db.ReferenceProperty(User,collection_name='posts')
post_content = db.TextProperty()
published = db.BooleanProperty()
Это правильно, или мне нужно изменить это. Спасибо
1 ответ
Есть разные способы сделать отношения многие ко многим. Использование ListProperties является одним из способов. При использовании ListProperties следует иметь в виду ограничение, заключающееся в том, что существует ограничение на количество индексов на объект и ограничение на общий размер объекта. Это означает, что существует ограничение на количество объектов в списке (в зависимости от того, достигли ли вы сначала индекса или размера объекта). См. Внизу этой страницы: https://developers.google.com/appengine/docs/python/datastore/overview
Если вы считаете, что количество ссылок будет работать в пределах этого лимита, это хороший способ. Учитывая, что у вас не будет тысяч администраторов для Страницы, это, вероятно, правильный путь.
Другой способ состоит в том, чтобы иметь промежуточную сущность, которая имеет ссылочные свойства по обе стороны от многих из многих. Этот метод позволит вам масштабироваться намного выше, но из-за дополнительных операций записи и чтения сущностей это намного дороже.