Ответ 1
В этом дизайне я боюсь, что ваш тег Entity может быть узким местом, особенно если вы ожидаете, что некоторые теги будут очень распространены. Три конкретных вопроса, о которых я могу думать, - это эффективность ваших попыток, пометок, написания раздора и взрывающихся индексов. Давайте посмотрим на stackoverflow для примера - сейчас есть 14 000 сообщений с меткой "java".
- Это означает, что каждый раз, когда вам нужно получить свой объект java-тега, вы извлекаете ключевые данные из 14 тыс. данных из хранилища данных. то вы отправляете все обратно, когда делаете ставку. которые могут содержать до нескольких байтов.
- В дополнение к байтам, идущим взад и вперед, каждый столбец требует обновления индексов. каждая запись в ListProperty отображает отдельную запись индекса. так что теперь вы делаете множество обновлений индексов. что приводит нас к числу 3...
- Взрывающие индексы. каждый объект имеет ограничение на количество записей индекса, которое может иметь. Я думаю, что предел составляет 5000 на сущность. так что на самом деле это трудный предел в отношении того, сколько сообщений может иметь один и тот же тег.
Дальнейшее чтение:
-
этот post затрагивает некоторые проблемы с большими списками
Хорошей новостью является то, что некоторые из ваших требований будут легко обрабатываться только объектом Post. Например, вы можете легко найти все сообщения, у которых есть весь список тегов с фильтром запросов следующим образом:
Query q = pm.newQuery(Post.class)
q.setFilter("tags" == 'Java' && "tags == 'appengine'");
Для всех сообщений с тегами java или appengine вам нужно сделать один запрос для каждого тега, а затем объединить результаты самостоятельно. Хранилище данных не обрабатывает операции типа OR/IN прямо сейчас.
Поиск похожих сообщений звучит сложно. Я подумаю об этом после кофе.