2010-07-06 3 views
8

Я работаю над приложением, которое имеет аналогичную логику как SO в отношении того, когда пользователь был в последний раз замечен. Я столкнулся с концептуальной проблемой, которую я надеюсь, что некоторые из вас, Гуру, могут мне помочь.Как написать логику «Последнее посещение» как на переполнении стека

Вся активность регистрируется в таблице ActivityLog в базе данных

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

Проблема, с которой я столкнулся, заключается в следующем.

Если я использую самый последний элемент активности, перейдите на страницу моей личной учетной записи, «Последнее посещение» появится как 1 секунда назад, потому что я просто ударил db при запуске сеанса ... Это не хорошо, потому что я хочу видеть, что я был «последним» там, а не когда я там «сейчас».

Однако, если я использую Skip(1).Take(1), чтобы получить вторую запись в базе данных, тогда, когда кто-то другой просмотрит мой профиль, пока я могу «просто» подписаться ... они увидят, что я говорил неделю назад а не сегодня.

Какую логику вы бы использовали, чтобы иметь ваш торт и есть его?

Я использую ASP.NET MVC2 и Linq для SQL, но я думаю, что этот вопрос является скорее агностиком языка.

ответ

3

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

+0

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

+0

также, так как я использую LINQ to SQL с IQueryable уровнем репозитория, я не думаю, что извлечение данных из журнала активности будет слишком интенсивно, даже если журнал растет. Поиск в основном делает OrderBy и Select Top 1 (или Second) –

+0

также, также ... Как раз сказать, я думаю, что это может быть самый простой ответ до сих пор ... часть о отображении SECOND для текущего пользователя и FIRST для всех o пользователей. –

2

Одно место, чтобы посмотреть это в исходном коде на OSQA (открытый источник д & система) -

http://www.osqa.net/

И да, это выглядит как StackOverflow (чтобы не сказать больше).

3

Что бы я сделал (просто чтобы избежать большого логического цикла) было бы добавить два поля. current_seen и last_seen. При входе в систему перейдите current_seen в last_seen и установите current_seen в текущую временную шкалу. Затем отобразите last_seen как «Последний раз видели в XX/XX/XXX».

+0

Я использую OpenID и фактически поддерживаю регистрацию пользователя до выхода из системы. Это означает, что каждый раз, когда создается новый сеанс, этот процесс должен произойти (или всякий раз, когда он выполняет другую деятельность на сайте). –

+0

Кроме того, этот метод мышления в значительной степени точно такой же, как и «Skip (1) .Take (1)», о котором я упоминал выше (если я показываю только часть «Последнее посещение» в любой момент времени. –