Есть ли способ сделать агрегатные функции в Google App Engine?

Одной из приятных вещей, поддерживающих реляционные базы данных, являются агрегатные функции, такие как count, sum, avg и т. Д. Но кажется, что если вы используете GAE, при вставке или обновлении записи вы должны вычислить и сохранить count, sum, avg и т. Д. значения всей таблицы. Но что, если у вас много условных группировок? Данное лицо:

class Person {
    @Id
    Integer age;
    String city;
}

Если я хочу

общее количество человек исредний возраст

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

Ответы на вопрос(2)

бновлении / вставке / удалении.

Если вы не спроектировали такие агрегаты в свое приложение с самого начала, вы можете запустить скрипт черезAPI удаленного хранилища данных или настроить на стороне серверахрон работа это обработает все объекты и вычислит совокупности. Это довольно просто, просто имейте в виду квоту ЦП для каждого запроса.

для правильного использования хранилища GAE вам необходимо выборочно отменять нормализацию некоторых аспектов вашей модели, сохраняя «избыточные» данные, которые в БД в обычном виде вы будете пересчитывать на лету, такие как агрегаты (в целом и «»). сгруппированы по "единицам".

Однако не добавляйте такие поля вPerson стол в твоем случае - это мало смысла! Сделать другойPersonAggregates таблица со столбцами, такими как Город (ноль / отсутствует для общих итогов), Количество, TotalAges (проще в обслуживании: вычислить среднее значение в любое время как общее число, деленное на количество).

 rds29 нояб. 2012 г., 22:34
 rds29 нояб. 2012 г., 22:29
Отличный вопрос, и я рад видеть, что я выбрал хороший подход, создавая вид только для агрегации. Однако, как говорит @JD, реализация этой агрегации может быть дорогой и подверженной ошибкам. Я не нашел недвижимость для этого (что-то вродеtotalAge = db.AggregateProperty(of=Person.age), Как вы думаете, лучший подход?
 JD.08 июн. 2012 г., 00:30
Это звучит невероятно дорого, как во время разработки программного обеспечения, так и в загрузке процессора. Я должен думать, что Google подходит к хранилищу данных таким образом по уважительной причине, но моя первоначальная реакция вызывает ужас. Алекс, что это за хорошая книга или документ по передовому опыту, на которую ты бы сослался, например, на таких парней с тяжелым SQL?

Ваш ответ на вопрос