Есть ли способ сделать агрегатные функции в Google App Engine? - PullRequest
11 голосов
/ 14 июня 2009

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

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

Если я хочу

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

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

Ответы [ 2 ]

6 голосов
/ 14 июня 2009

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

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

3 голосов
/ 14 июня 2009

Для часто используемых агрегатов лучше всего обновлять их при каждом обновлении / вставке / удалении.

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

...