2009-08-20 6 views
0

Я создаю сайт прототипа для своей компании, в котором работает несколько тысяч сотрудников, и я столкнулся с проблемой, связанной с реализацией конкретного требования.ASP.NET + предложения по проектированию/внедрению SQL Server

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

Стена, в которой я сталкиваюсь, заключается в том, что она просто чувствует себя грязной, чтобы иметь доступ к службе Windows (или что-то еще), постоянно попадая в базу данных, ища учетные записи, которые должны «выплачивать» и принимать соответствующие меры.

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

Благодарим вас за идеи и предложения!

+0

Почему сервис Windows звучит грязно? – JMP

+0

Поскольку он должен быть установлен отдельно и не может быть упакован с кодом веб-сайта. –

+0

Кроме того, вам нужно будет делать 3 1/3 из них в секунду для каждых 1000 пользователей. Это означает, что запросы пользователей готовы, просматривают их текущие значения, вычисляют новое значение, обновляют старое, а также увеличивают таймер. Это обеспечит приличную нагрузку на систему. –

ответ

1

Вместо того, чтобы обновлять записи, всего вычислить начисленные проценты на лету.

Этот вид математики довольно прост, расчеты, скорее всего, будут на порядок быстрее, чем непрерывное обновление.

Что-то вроде следующего:

WITH depositswithperiods AS (SELECT accountid, depositamount, 
    FLOOR(DATEDIFF(n, deposit_timestamp, GETDATE())/5) as accrualperiods, interestrate 
    FROM deposits) 

SELECT accountid, sum(depositamount) as TotalDeposits, 
    sum(POWER(depositamount * (1 + interestrate), accrualperiods)) as Balance 
FROM 
    depositswithperiods 
GROUP BY accountid 

Я предположил, усугубляются интерес выше, и никакие изъятия.

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

+0

Мне это нравится, я играю и проверяю запрос, но сейчас это выглядит как хорошее решение. Спасибо! – dtrocchio

+0

На самом деле протестирован и сделал несколько настроек, это будет работать, если у кого-то нет веских причин, почему это не так. Еще раз спасибо! – dtrocchio

+0

О, и я отправлю окончательный запрос, как только я это сделаю. – dtrocchio

0

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

Вы можете сделать одно ночное обновление для всех учетных записей.

+0

Для аргументации скажем, что информация в базе данных должна быть обновлена ​​по любой причине. Однократная ночная работа не будет работать, и я понимаю ленивое обновление «на лету», когда запрашивается информация, но я обеспокоен тем, что становится проблемой сказать, нужна ли информация где-то в другом месте. Следить? – dtrocchio

+0

Вы можете обеспечить доступ к информации путем реализации расчета в SQL Server и отказа в прямом доступе к таблице для задействованных ролей. Внедрите хранимую процедуру, обеспечивающую правильное обновление. – Thorarin

0

Хорошая вещь, котор нужно думать когда делать такие вещи будет DateTime.

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

Как и другие, просто вычислите его, когда пользователь попытается его просмотреть.

Смежные вопросы