App Engine - цепочка сущностей генерирует исключительно длинные ключи сущностей - PullRequest
1 голос
/ 09 февраля 2010

Я пишу приложение, которое позволяет пользователям отправлять сообщения между ними. Я использую транзакции, чтобы убедиться, что между любыми двумя пользователями существует только одно «верхнее» сообщение, и это «верхнее» сообщение имеет ссылку на «следующее» сообщение и т. Д., Образуя своего рода связанный список Сообщения. Сообщения ссылаются друг на друга через ссылочные свойства и помещаются в одну группу сущностей, объявляя каждую новую "вершину" a, имеющую предыдущую "вершину", в качестве своего родителя.

Однако проблема этого подхода заключается в том, что у каждого нового объекта есть ключ, который включает в себя весь ключ предыдущего объекта (т. Е. New_top_key == old_top_key + new_stuff). Это приводит к тому, что ключи сущностей растут с большой скоростью и, вероятно, очень плохое поведение после нескольких сотен сообщений в одной цепочке (но я на самом деле не проверял).

Итак, мой вопрос: 1) Это преднамеренная особенность App Engine. 2) Должен ли я избегать такого типа структуры - или это как-то эффективно обрабатывается внутри App Engine? 3) Есть ли у вас какие-либо предложения о том, как правильно подходить для типа структуры со связанным списком сущностей?

Спасибо и всего наилучшего Alex

Ответы [ 2 ]

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

В заказе:

  1. Да. Каждый объект уникально идентифицируется по его виду, ключу или идентификатору, а также по всем его родителям, что означает, что вся цепочка необходима для идентификации объекта.
  2. Да. Вместо этого имейте сущность "разговор" (которая также может быть первым сообщением), которая является прямым родителем всех сообщений. Если вам все еще необходимо поддерживать отношения родитель / потомок в диалоге (например, вместо упорядочивания их по метке времени), объявите явное SelfReferenceProperty.
  3. См. № 2 выше.
1 голос
/ 09 февраля 2010

Вы используете Python или Java? Подробный ответ будет немного зависеть от того, какой API вы используете.

Я уверен, что ваши ключи будут расти бесконечно, это не лучший план. (хотя это может быть хорошим тестовым примером для API приложений, хотя:)

Я думаю, что решение будет состоять в том, чтобы отделить информацию о группе сущностей от информации, связывающей сообщения. Чтобы выполнять транзакции в потоке / разговоре / цепочке / чем угодно, все ваши сообщения должны быть в одной группе сущностей. Однако они не обязательно должны находиться в иерархии, которая точно соответствует структуре связей между сообщениями. Вы должны явно установить родителя (группу сущностей) для всех ваших сущностей сообщений одинаковыми в плоской структуре. Таким образом, каждая сущность будет родственной по отношению к другим, в смысле групп сущностей. Вам также понадобится поле в вашей сущности для ссылки на следующее (и / или предыдущее) сообщение. Таким образом, у вас все еще был бы связанный список (или дерево или что-то еще) в терминах ссылок «предыдущего сообщения».

И в Python, и в Java есть методы для создания сущности с определенной родителем / группой сущностей. (На самом деле, вы даже можете указать несуществующую сущность как корень иерархии группы сущностей!)

Теперь ключ каждого сообщения будет иметь фиксированную длину, поэтому ваши ссылочные свойства "next" и "previous" будут хорошими и безопасными от превышения некоторого ограничения длины ключа.

...