10

Я строю приложение в Google App Engine (Java), где пользователи могут принимать сообщения, и я имею в виду в добавлении тегов на эти посты, так что я буду иметь что-то вроде этого:App engine datastore: Как реализовать сообщения и теги без соединений?

в сущности сообщение:

public List<Key> tags; 

в сущности категории:

public List<Key> posts; 

было бы легко запросить, например, все сообщения с определенным тегом, но как я могу получить все сообщения, которые имеют список тегов? Я мог бы сделать запрос для каждого тега, а затем сделать пересечение результатов, но, возможно, есть лучший способ ... потому что это будет медленным с множеством сообщений.

Еще одна вещь, которая может быть сложнее, состоит в том, чтобы иметь пост, получать сообщения, которые имеют общие теги, упорядоченные по количеству общих тегов, поэтому я мог бы получить «похожие» сообщения этому.

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

Спасибо!

ответ

5

С этим дизайном, я боюсь, что ваша организация тегов может быть узким местом, особенно если вы ожидаете, что некоторые теги будут очень распространены. Три конкретных вопроса, которые я могу придумать, - это эффективность ваших попыток, пометок, написания раздора и взрывающихся индексов. Давайте посмотрим на stackoverflow для примера - сейчас 14 000 сообщений помечены как «java».

  1. Это означает, что каждый раз, когда вам нужно получить свой объект java-тега, вы извлекаете ключевые данные 14k из хранилища данных. то вы отправляете все обратно, когда делаете ставку. что может составлять много байтов.
  2. В дополнение к байтам, идущим взад и вперед, каждый столбец требует обновления индексов. каждая запись в ListProperty отображает отдельную запись индекса. так что теперь вы делаете множество обновлений индексов. что приводит нас к числу 3 ...
  3. Взрывающие индексы. каждый объект имеет ограничение на количество записей индекса, которое может иметь. Я думаю, что предел составляет 5000 на сущность. так что на самом деле это жесткое ограничение на количество сообщений, которые могут иметь один и тот же тег.

Дополнительная литература:

  • это post затрагивает некоторые из проблем, с большими списками

  • Exploding indexes

Хорошая новость заключается в том, некоторые из ваших требований будет легко обрабатываться только объектом Post. Например, вы можете легко найти все сообщения, которые имеют все списка тегов с фильтром запроса, как это:

Query q = pm.newQuery(Post.class) 
q.setFilter("tags" == 'Java' && "tags == 'appengine'"); 

Для всех сообщений с либо ява или Appengine теги, вы должны сделать один запрос для каждого тега, а затем объединить результаты самостоятельно.В настоящее время хранилище данных не обрабатывает операции типа OR/IN.

Поиск похожих сообщений звучит сложно. Я подумаю об этом после кофе.

+1

Я не знал, что когда я получил объект с свойством списка, все объекты в этом списке также были извлечены ... Это так? Так что я удалю список сообщений. Я также не знал, что могу запросить этот способ над свойством списка: q.setFilter ("tags" == 'Java' && "tags == 'appengine'"); Это действительно хорошая новость :) Спасибо, Питер. – Damian

+0

Полные объекты в списках могут или не могут быть получены в зависимости от того, как вы реализуете свои сущности и используете ли вы JDO или JPA (например, о группах выборки в JDO). Но даже если вы просто загружали ключи, несколько тысяч ключей начнут складываться, если вы постоянно перемещаете их туда и обратно. –

1

Возможно, вы захотите посмотреть это видео от Google IO. Объекты индекса привязки - это то, что вам нужно, и позволяет удалить List<Key> posts на объекте Tag. Также как List<Key> tags на объекте Post.

1

Просмотреть запись в блоге @ topchef: Efficient Keyword Search with Relation Index Entities and Objectify for Google Datastore. В нем говорится об осуществлении поиска со свойствами списка с использованием объектов индекса привязки и Objectify.

+0

Это был его ответ на мой вопрос: http://stackoverflow.com/questions/5778606/how-do-you-use-list-properties-in-google-app-engine-datastore-in-java – onejigtwojig

Смежные вопросы