C архитектурой/выборкой с таблицы?

Всем привет!


Помогите, пожалуйста, решить ситуацию: есть некая таблица, назовем ее timeline, куда пишутся все события, которые происходят с пользователем. Например, кто-то его добавил в друзья, у его друзей что-то произошло и все такого рода. В таблице есть первичный ключ, автоинкремент — все классически. Есть поле date_created — дата создания записи.


Теперь о сложностях. Хочу сделать подгрузку сообщений при скроллинге. Например, вывел 10 сообщений, долистал до низа — подгружаются еще 10. Все логично и просто до тех пор, пока не происходят события, попадающие на одну и ту же дату с точностью до секунды. Т.е. выборку
select * from timeline where date_created<дата_последнего_сообщения_в_ленте LIMIT 10
уже нормально не сделать — пропадет часть сообщений. Сортировку по первичному ключу тоже не получится сделать — в будущем в таблицу timeline могут писаться события за прошлые периоды и ID, выступающий в роли order_id, потеряет свою актуальность.


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


Можно решить вопрос следующим образом — dba.stackexchange.com/questions/23981/mysql-select...

Но тут не нравятся двойная сортировка и переменные.


Может быть у кого-то был опыт подобного и можете предложить другое решение?
  • Вопрос задан
  • 3298 просмотров
Пригласить эксперта
Ответы на вопрос 4
nazarpc
@nazarpc
Open Source enthusiast
А почему не использовать?:

select * from timeline where ORDER BY date_created DESC LIMIT start, 10

Вместо start подставляете 10 * (порция№ — 1)
Ответ написан
leutsky
@leutsky
делаете индекс по date_created, лучше его вообще в виде unix_timestamp хранить (а лучше создаете сразу составной индекс id & date_created)

когда вам нужно будет догрузить еще 10 записей, отправляете параметры (id и date_created) последней записи (т.е самой нижней в списке событий), а запрос будет вида:

SELECT * FROM timeline WHERE id > %s AND date_created <= %s ORDER BY date_created DESC, id ASC LIMIT 10


т.е запись с переданным id будет пропущена и будут выбраны еще 10 записей, которые вам нужны, и которые идут прям за записью с номером id

Недостаток в следующем:
— если во время просмотра пользователем страницы будет создана запись с date_created большим, чем передано в запросе, то эта запись будет показана только при перезагрузке страницы с событиями.
Ответ написан
rakot
@rakot
У вас PK это автоинкримент? Если да, то вот так

select * from timeline where id>id_последнего_сообщения_в_ленте LIMIT 10
Ответ написан
@Sayonji
Передавайте назад только айди записей, которые имеют дату ту же, что дата_последнего_сообщения, раз вас смущают большие запросы.
А потом как выше предлагали WHERE date_created <= $last AND id not in $ids. Получать эти айди на клиенте можно, если жалко серверного времени.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы