У меня может быть 500 объектов в которых есть поля, которые надо
проссумировать. Как это сделать не представляю. Единственное что
приходит в голову это просто в цикле, перебором на стороне сервера или
клиента просматривать все объекты и суммировать их поля, но кажется,
что это может быть долго и нагрузка на сервер или ПК пользователя
великовата. Как вообще это делается?
Пока я вижу три варианта:
1. Изначально который я предположил, это <<тупо>> суммировать и
группировать значения в цикле. Если будет не много объектов, то в
принципе это вариант, но когда их будет много, то может возникнуть
проблема.
2. Создать специальные объекты в которых будут хранится все
необходимые суммы и группировки. Обновлять эти данные вместе с
добавлением, удалением или модификацией объектов. Я понимаю это как
создание независимого отношения <<один-ко-многим>>, где множество
основных объектов будут содержать ключ группирующего объекта (там
хранятся суммы и прочие сгруппированные данные). Но при независимом
отношении транзакции не работают, а значит, могут возникнуть проблемы
с <<синхронизацией>> данных. На что обратил внимание Даниил.
3. Тоже самое, что первый и второй вариант, обновлять группирующие
объекты по расписанию, а не в момент изменения основных объектов, т.е.
перебором в определенное время. А что бы не гонять каждый раз в цикле
все основные объекты, писать в них пометку, что этот объект был
изменен или новый. Минус, что пока не знаю, как отмечать, что какой-то
объект был удален, не суммируя их все снова и то, что правильные суммы
будут не оперативно получатся.
Что-то я в документации я не могу найти описание распределенных
транзакций. Этот механизм ещё не реализован в GAE или для него ничего
особенного делать не надо, всё тоже самое, что и для локальных
транзакций?
Может быть, придется объединять 2 и 3 способы. Т.е. делается всё как
во втором, но периодически запускается проверка на правильность
ссумированных данных.
Такое ощущение, что GAE не рассчитан для сложных манипуляций с данными
и поэтому всё придется делать руками, со всеми последствиями.
On 1 июл, 19:10, Daniel Burdakov <kre...@kreved.org> wrote:
> Второй вариант имеет сразу два подводных камня
> 1) С точки зрения datastore. Если данных много, то в одну entity group их
> запихнуть не получится, а значит локальные транзакции невозможны. Можно
> работать вообще без транзакций, но сбитые агрегаты - это фэйл. Другой
> вариант - это распределённые транзакции, судя по описанию они помогут во
> многих проблемах такого рода, однако я пока не пробовал работать с ними,
> только читал. Материалы по DT:http://code.google.com/intl/ru-RU/events/io/2009/sessions/DesignDistr...,http://danielwilkerson.com/dist-trans-gae.html,http://code.google.com/p/tapioca-orm/
Единственный вариант это третий, т.е. периодическая <<агрегация>>
данных, т.е. смерится, что оперативности не будет. Но я посмотрел на
то, что мне надо получить и выходит несколько не простая задача. В
общем, задача не из легких, столько надо учесть, столько условий
разных. И всё это только потому, что нет агрегатных функций. :)
On 2 июл, 00:07, Daniel Burdakov <kre...@kreved.org> wrote:
> В datastore распределенные транзакции не реализованы, они реализуются с
> помощью библиотеки на стороне клиента (под клиентом подразумеваю не браузер
> пользователя, а Ваш код на сервере). Всё взаимодействие с datastore идёт
> через эту библиотеку. И если во время распределённой транзакции поток был
> убит по таймауту - то при следующем обращении к datastore (возможно уже
> другим потоком), незавершённые транзакции будут откачены назад или
> завершены. Таким образом поддержка DT со стороны datastore не требуется.
>
> Другое дело, что год назад на презентации про эту идею рассказали, черновик
> стандарта сделали, библиотеку (tapioca-orm) написали... Но с тех пор ни
> новостей ни обновлений нет, так что похоже это дело забросили, а жаль.
>
> Насчёт комбинации второго и третьего способов - это приемлемо, если мы
> показываем агрегированные данные пользователю. А если же результат агрегации
> используется в дальнейшем для принятия каких-либо решений, или дальнейших
> расчётов - то, даже если в дальнейшем (при следующей проверке) показатели
> будут пересчитаны, - будет уже поздно.
>
> 1 июля 2010 г. 19:36 пользователь Keus <dmihail...@gmail.com> написал:
>
>
>
> > Второй вариант, конечно, был бы лучше всего, но эти транзакции всё
> > портят.
>
> > Что-то я в документации я не могу найти описание распределенных
> > транзакций. Этот механизм ещё не реализован в GAE или для него ничего
> > особенного делать не надо, всё тоже самое, что и для локальных
> > транзакций?
>
> > Может быть, придется объединять 2 и 3 способы. Т.е. делается всё как
> > во втором, но периодически запускается проверка на правильность
> > ссумированных данных.
>
> > Такое ощущение, что GAE не рассчитан для сложных манипуляций с данными
> > и поэтому всё придется делать руками, со всеми последствиями.
>
> > On 1 июл, 19:10, Daniel Burdakov <kre...@kreved.org> wrote:
> > > Второй вариант имеет сразу два подводных камня
> > > 1) С точки зрения datastore. Если данных много, то в одну entity group их
> > > запихнуть не получится, а значит локальные транзакции невозможны. Можно
> > > работать вообще без транзакций, но сбитые агрегаты - это фэйл. Другой
> > > вариант - это распределённые транзакции, судя по описанию они помогут во
> > > многих проблемах такого рода, однако я пока не пробовал работать с ними,
> > > только читал. Материалы по DT:
> >http://code.google.com/intl/ru-RU/events/io/2009/sessions/DesignDistr...,
> >http://danielwilkerson.com/dist-trans-gae.html,http://code.google.com...