Отношения один-ко-многим в НДБ


Я читаю на Google app engine и готовлю образец, чтобы лучше понять его.

В двух словах пользователь может записать запись на каждый день месяца, как в календаре. И пользователь может просматривать записи на ежемесячной основе. Так что не более 30 иш за раз.

Первоначально я использовал db, и отношение "один ко многим" было прямым.

Но как только я столкнулся с ndb, я понял, что есть два способа моделирования одного ко многим. отношения. 1) структурированное свойство, по-видимому, действует как повторяющееся свойство в пользовательской модели. Означает ли это, что если я получу одного пользователя, я автоматически получу все записи, которые она ввела? (например, весь год) это не очень эффективно, не так ли? Я думаю, что преимущество заключается в том, что вы получаете все связанные данные в одной операции чтения.
    from google.appengine.ext import ndb

    class User(UserMixin, ndb.Model):
        email = ndb.StringProperty(required = True)
        password_hash = ndb.TextProperty(required = True)
        record = ndb.StructuredProperty(Record, repeated=True)

    class Record(ndb.Model):            
        notes = ndb.TextProperty()

2) в качестве альтернативы я мог бы использовать, возможно, более классический способ:

    class User(UserMixin, ndb.Model):
        email = ndb.StringProperty(required = True)
        password_hash = ndb.TextProperty(required = True)

    class Record(ndb.Model):
        user = ndb.KeyProperty(kind=User)
        notes = ndb.TextProperty()

Какой способ лучше в моем использовании случае?

1 4

1 ответ:

Недостатком использования StructuredProperty вместо KeyProperty является то, что при использовании StructuredProperty ограничение на общий размер сущности (1 МБ) применяется к сумме пользователя и всех записей, которые он содержит (поскольку структурированные свойства сериализуются как часть сущности пользователя). С этот, каждая запись имеет 1МБ лимит сам по себе.