Оптимальный дизайн MySQL для пользовательских лент новостей - PullRequest
1 голос
/ 11 августа 2010

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

Создать ленту активности для всего сайта просто, потому что все записывается в основную таблицу каналов, а я просто строю список.У меня есть основная таблица каналов в MySQL, в которой содержатся простые журналы:

  1. тип деятельности;
  2. тип целевого объекта;
  3. идентификатор целевого объекта;
  4. тип исходного объекта (т. Е. Пользователь или организация);
  5. идентификатор исходного объекта.

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

При создании пользовательского канала I 'Я пытаюсь найти способ объединить таблицу отношений с таблицей каналов и использовать ее для анализа результатов.У меня есть таблица отношений, состоящая из «следующих» отношений, которая похожа на таблицу каналов.Это проще, хотя ч / б только одному типу пользователей разрешено следовать другим типам контента / пользователям.

  1. идентификатор пользователя / источника;
  2. тип целевого объекта;
  3. идентификатор целевого объекта.

Столбцы 2 и 3 в таблице каналов и подписок совпадают, и я пытался использовать различные методологии JOIN, чтобы сопоставить их, а затем ограничить их любыми отношениями в следующей таблице, которые есть у пользователя.,Это не очень успешно.

Базовый запрос, который я использую:

 SELECT *
 FROM (`feed` as fe) LEFT OUTER JOIN `follow` as fo
                     ON `fe`.`feed_target_type` = `fo`.`follow_e_type`
                        AND fo.follow_e_id = fe.feed_target_id
 WHERE `fo`.`follow_u_id` = 1 OR fe.feed_e_id = 1
       AND fe.feed_e_type = 'user'
 ORDER BY `fe`.`feed_timestamp` desc LIMIT 10

Этот запрос также пытается получить любой контент, созданный пользователем (какие данные вошли в систему).таблица фидов), которую пользователь, по сути, выполняет по умолчанию.

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

1 Ответ

0 голосов
/ 13 января 2011

На первом сайте, который я создал с помощью ленты действий, была таблица уведомлений, в которой регистрировались действия, а затем из этого извлекались действия друзей.Однако за несколько месяцев это привело к миллиону записей.

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

...