Когда следует использовать ndb.KeyProperty против предков?

В хранилище данных NDB AppEngine NDB, похоже, есть два способа связать объекты друг с другом. Существуют ключи ndb.KeyProperty и родители/предки. Я немного смущен, когда я должен использовать то или другое?

Сейчас я использую KeyProperty исключительно, так как он наиболее знакомый, но я хочу знать, когда он лучше подходит, чем другой.

Ответ 1

Предки иерархичны - их можно использовать, когда у вас есть иерархические отношения между вещами (например, в системе форума у ​​вас может быть Forum, у которых есть Topic, которые, в свою очередь, имеют Post s).

KeyProperty не является по сути иерархическим - он просто предоставляет ссылку. Он должен использоваться для неиерархических связей между элементами. Повторяя пример форума из предыдущего абзаца, можно использовать KeyProperty, чтобы связать a Post с User, который его создал, потому что User не находится в иерархии форума-темы-сообщения. Они связаны со всеми 3 (например, User может создавать сообщение, создавать тему и/или модерировать форум).

В конце концов, однако, основной компромисс между предками и ключами является согласованностью и пропускной способностью: запросы на основе предков дают вам сильную согласованность относительно последних обновлений, но налагают ограничение в 1 модификацию в секунду для любой данной группы сущностей и ограничение максимального размера для группы из-за отсутствия распределения.