Связь «один ко многим» в ndb

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

Короче говоря, пользователь может записывать запись на каждый день месяца, как в календаре. И пользователь может просматривать записи ежемесячно. Так что не более 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()

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


person Houman    schedule 19.06.2013    source источник
comment
Могут ли записи Record быть прочитаны без ведома Пользователя? Если да, то я бы использовал ndb.KeyProperty(), если требуется User, то ndb.StructuredProperty   -  person bnlucas    schedule 19.06.2013
comment
@bnlucas Им нужно сначала войти в систему, чтобы просматривать/редактировать/удалять свои дневные записи в течение месяца. Следовательно, пользователь должен быть получен при входе в систему в любом случае, чтобы увидеть, какие записи принадлежат пользователю в первую очередь. Следовательно, вы считаете, что ndb.StructuredProperty лучше? Могу ли я по-прежнему фильтровать текущий месяц, чтобы иметь менее затратную операцию чтения, или это в любом случае даст мне все записи? Спасибо   -  person Houman    schedule 19.06.2013


Ответы (1)


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

person Guido van Rossum    schedule 19.06.2013
comment
KeyProperty это тогда. Спасибо - person Houman; 20.06.2013