DB-независимые вычисления: хорошо ли хранить результаты расчетов?Если да, какой лучший способ сделать это? - PullRequest
1 голос
/ 23 декабря 2011

Я хочу выполнить несколько простых вычислений, оставаясь независимым от базы данных в моем приложении rails.

У меня есть три модели:

 .---------------.       .--------------.           .---------------.
 | ImpactSummary |<------| ImpactReport |<----------| ImpactAuction |
 `---------------'1     *`--------------'1         *`---------------'

В основном:

  • ImpactAuction содержит данные о ... аукционах (цены, количество и т. Д.).

  • ImpactReport содержит ежемесячные отчеты, которые имеют много аукционов, а также другие атрибуты; он также показывает некоторые результаты расчетов на основе аукционов.

  • ImpactSummary содержит набор отчетов, а также некоторую информацию о конкретном году, а также показывает результаты расчетов на основе двух других моделей.

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

  1. это хорошая практика для хранения результатов расчетов? Я уверен, что это не очень хорошая вещь, но приемлемо ли это?

  2. это полезно, или я не должен беспокоиться и выполнять вычисления на лету?

  3. Если это хорошая практика и полезно, как лучше достичь того, чего я хочу?

Это сложная часть. Сначала я реализовал простую цепочку обратных вызовов , которая обновляла бы поля вычисления родительской модели при сохранении (то есть, когда аукцион создается или обновляется, он помечает some_attribute_will_change! в своем отчете и сохраняет его, что вызывает его собственные обратные вызовы и т. Д.).

Этот подход хорошо подходит при создании / обновлении одной записи, но если я хочу работать с несколькими записями, он будет запускать вычисления по всей цепочке для каждой записи ... Так что я вдруг обнаружил, что вынужден поставить условие на обратные вызовы ... в зависимости от того, есть ли у меня одна или несколько записей, которые я не могу понять, как (используя метод класса, который можно вызывать для отношения, используя атрибут экземпляра @skip_calculations для каждой записи, просто используя outdated поле для отметки родительских записей для последующего расчета?).

Любой совет приветствуется.

Бонусный вопрос: Считается ли это независимым от БД, если я реализую это с представлениями БД?

1 Ответ

0 голосов
/ 24 декабря 2011

Как обычно, это зависит. Если вы можете выполнять вычисления в базе данных, используя представление или #find_by_sql, я бы сделал это. Вы избавите себя от многих проблем: вам нужно будет обновлять свои сводки при изменении значений. Вы уже столкнулись с проблемой при обновлении нескольких строк. Наличие представления или запроса, реализующего представление, хранящееся как текст в ImpactReport, позволит вам всегда иметь свежие данные.

Ответ? Benchmark, ориентир, эталон;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...