2009-09-21 1 views
3

У меня есть проект, который вычисляет ряд «статистики» о производительности пользователей, а затем показывает их им. Все эти статистические данные в конечном итоге исходят из большой таблицы «взаимодействий», которые фиксируют взаимодействие пользователей с сайтом. На данный момент все эти статистические данные рассчитываются путем просмотра этих данных. Мы широко используем постоянное кэширование, чтобы ускорить эту работу.Статистика пользователя: «взаимный расчет» или объемный расчет + кеширование

Мы планируем перейти к «итеративному дизайну», где статистические значения хранятся в db, и при регистрации каждого взаимодействия мы обновляем значения в зависимости от того, что вклад этих взаимодействий в каждый балл, поэтому мы по существу итеративно обновляя значения. (сейчас мы просто загрязняем кеш).

Я вижу некоторые проблемы с итерационным дизайном, потому что это означает, что у нас есть эта избыточная, потенциально не синхронизированная информация, хранящаяся в нашей базе данных, что затрудняет добавление новых статистических данных и означает большую работу над каждым журналом взаимодействия. Преимущество заключается в том, что он упрощает статистический поиск до одиночного удара db!

Что-то в этом итеративном проекте вызывает сигналы тревоги для меня, но я не могу отрицать потенциальную экономию времени. Должен ли я повиноваться этому чувству кишки, или идти вперед и делать это?

+0

некоторые цифры: Каждая статистика рассчитывается из нескольких сотен строк и нескольких ударов db. Несмотря на то, что они называются статистическими данными, количество хрустов не является значительным, реальное «узкое место» производительности манипулирует данными. – Chris

ответ

1

Когда я делаю проект базы данных, я стараюсь избегать хранения избыточных данных, когда это возможно. (Это, в конце концов, объект нормализации базы данных). Вычисляемые столбцы и представления в порядке - они управляются и обновляются автоматически сервером SQL. Лично я склонялся к другим путям, прежде чем использовать БД для кеширования (Является ли SQL-запрос действительно частью, требующей повышения производительности? Могу ли я упростить ситуацию в приложении с помощью представления SQL?)

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

+0

Нет манипуляций с базой данных, я просто хотел потянуть в 200 или около того строк, массируя то, что я хочу от него (иногда все его уникальные явления с определенными значениями, иногда это количество номеров строк, которые соответствуют чему-то и т. Д.)). Ничто из этого не связано с записью DB, только когда материал записывается (на данный момент!). – Chris

+0

В этом случае вам может быть лучше добавить индексы вместо их удаления. =) Прежде чем вы это сделаете, проблема с производительностью возникает из-за множественных ударов базы данных? Или медленность выполняемого запроса? Или просто количество возвращаемых результатов? Если проблема связана с несколькими ударами БД или с тем, как вы вычисляете/извлекаете нужные данные, вы можете исправить это, переместив логику в представление/общее табличное выражение (SQL Server)/определяемую пользователем функцию/хранимая процедура. Я не говорю, что кеширование данных в БД неверно, просто для меня это последнее средство. – RMorrisey

0

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

Это было бы полезно, если чтение намного выше, чем запись. Если я делаю 2 записи для каждого чтения, это будет плохой дизайн.

Некоторые подробности о том, что вы делаете, было бы полезно

+0

Триггеры/Сигналы будут так, как я буду запускать итеративные обновления! Запись только происходит (на данный момент), когда данные регистрируются из пользовательского взаимодействия. Статистический расчет не связан с записью. Так что в целом это более читаемое приложение. – Chris

0

Расчет на вставной-основе, безусловно, путь, ИМХО.

Чтобы покрыть проблемы, скажем, не будучи в состоянии генерировать новую статистику сразу (потому что у вас нет расчетных данных), вы можете:

  • Run насыпного отчет о новом стата отсутствует

или

  • Вычислить его на лету и слияния с кэшем

В зависимости от вашей модели кэширования статистика может быть не синхронизирована, или они могут и не быть. Если это с триггерами, это происходит немедленно (при вставке в tblFoo обновление tblFooStats); но вы можете получить это по мере необходимости.

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