powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Задача - блоги:френдлента
4 сообщений из 4, страница 1 из 1
Задача - блоги:френдлента
    #36015306
Nick Mazurkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Стандартная задача про френдленту. Блоги-посты-пользователи-друзья. Делаю на MySQL

Не могу придумать способ эффективного решения задачи. В двух словах задача описывается как "выбрать все посты созданные кем-либо из указанной группы и отсортированные в порядке убывания даты создания". Непонятно даже какой индекс завести.

Пока делаю "в лоб"

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
  SELECT *
    FROM tbl_posts
      INNER JOIN (
        SELECT member_id_target as member_id
          FROM tbl_friendships
          WHERE (member_id_source = #memberId#)
        ) AS tbl_queried ON (tbl_queried.member_id = tbl_posts.member_id)
      WHERE (post_access =  0  /* public */ ) OR (post_access =  2  /* friends only */)
    ORDER BY post_created DESC
    LIMIT #count#
    OFFSET #offset#

Внутренний подзапрос эффективно использует индекс (member_id_source, member_id_target) - но все остальное работает не эффективно - использует временные таблицы и сортировку.

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

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

В общем, буду рад выслушать любые идеи
...
Рейтинг: 0 / 0
Задача - блоги:френдлента
    #36015335
Nick Mazurkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
План

Код: plaintext
1.
2.
3.
id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 1 	PRIMARY	<derived2>	system					 1 	Using filesort
 1 	PRIMARY	tbl_posts	ref	XXX	idx_posts_member	 4 	const	 1 	Using where
 2 	DERIVED	tbl_friendships	ref	ak_friendship,idx_friendship	ak_friendship	 4 	""	 1 	Using index

XXX = idx_posts_member,idx_posts_created_access,idx_posts_popularity_access,idx_posts_created_typed_access,idx_posts_popularity_typed_access

То есть вроде запрос сам правильный, но первоначальная концепция хромает - выбираются все посты каждого из друзей и только потом все вместе сортируются - хочется большей эффективности
...
Рейтинг: 0 / 0
Задача - блоги:френдлента
    #36017581
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nick Mazurkinно тут тоже засада, что если наши друзья давно ничего не писали - мы пройдемся сканом по всей таблице.
Можно ограничить по дате.
...
Рейтинг: 0 / 0
Задача - блоги:френдлента
    #36017582
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nick MazurkinВ общем, буду рад выслушать любые идеи
Cходу... пожалуй, пока неизвестна нагрузка, я бы сделал индекс на дата+ид_человека и выбирал бы по условию дата > (последний заход минус неделя), ид_человека в друзьях. Когда и если станет тормозить - повесил бы триггера, поддерживающие список в момент сохранения поста. Думаю, этого хватило бы, и написать обновление списка при нескольких операциях (добавление-удаление друга, добавление-удаление-модификация поста) нетрудно. Если вдруг и тормоза при отправке поста станут критичны - убрать триггера и ставить флаг, по которому сработает фоновый процесс.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Задача - блоги:френдлента
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]