Что предпочесть в GQL; StringListProperty или ListProperty?
-
10-10-2019 - |
Вопрос
Я строю приложение со многими ко многим отношениям; Предмет объекта «изображения» может быть связан с любым количеством галерей («Галерея»). И, конечно же, галерея может хранить любое количество фотографий.
Таким образом, следуя предложению Google здесь, я буду использовать список на «картине», который держит иностранные ключи «Галереи». Это большой подход.
(Реляционный DB-подход в старом стиле состоит в том, чтобы иметь таблицу / сущность между «картиной» и «галереей».)
Вот мой вопрос: при хранении ключа я должен перейти на «StringListProperty» на «картине» или «ListProperty (DB.Key)» будет работать лучше?
Одна причина, по которой я вижу для StringList Было бы, чтобы я мог хранить также другие значения, чем клавиши, но с другой стороны, это все равно было бы грязным стилем. Но я также почти уверен, что Google предложил не использовать больше одного списка в сущности, потому что индекс (ES) взорвется. Так что это оставит меня в бэкдоре.
Для ListProperty с типом "Ключ«Одним из пунктов будет автоматическая проверка, если значение на самом деле является ключом.
Поскольку очень легко преобразовать строки в ключи и наоборот, я не вижу причин для одного из типов списков, чтобы предпочесть здесь.
Когда дело доходит до проблем с производительностью, я понятия не имею, как я могу это проверить, но похоже, что это будет основным фактором в этом решении.
Любопытно о вашем вкладе. Особенно, если кто -то проверил производительность на этом или будет таким добрым и сделает это.
Ура, // Ханнес
Решение
Использовать db.ListProperty(db.Key)
Если вы собираетесь хранить списки ключей. Они будут храниться в двоичном представлении, которое более компактно, чем представление строки, которое вы использовали бы в списке строк.
Вы правы, что смешивание ключей с другими объектами в списке грязно. Наличие нескольких списков в сущности - это хорошо, если вы не индексируете больше, чем один из них в одном и том же пользовательском индексе - это то, что вызывает взрывные индексы.
Другие советы
Используйте db.listproperty (db.key), это облегчит извлечение данных, чем String. Если модель галереи имеет Pic_list, которая имеет тип db.listproperty (db.key), который содержит список ключей картинки Entity .. Предположим, что изображение - это название вашей сущности .. Затем Picture.get (// GalleryObject //. PIC_LIST) получит все изображение Entision ..