Уведомление / Лента новостей с PHP и MySQL - PullRequest
4 голосов
/ 18 января 2011

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

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

Я расскажу о своих проблемах только в части уведомлений в этом сообщении (это будет очень длинное и хаотичное сообщение, если я также включу ленту новостей).

Вот мой первый черновик таблицы MySQL.

<b>notificationID</b>
Primary key

<b>notificationModule</b>
Module type foreign key - photo, video, comment, message

<b>notificationConstructor</b>
Foreign key of the element (which is of type "notificationModule") that triggered the creation of this notification

<b>notificationUser</b>
The user that this notification is aimed towards

<b>notificationTime</b>
Time at which the notification was created

<b>notificationFlag</b>
Notification has been read flag

Возможные проблемы / конфликты

  • Событие, когда пользователь комментирует фотографию, которую уже прокомментировали два разных пользователя, вызовет три уведомления? Один для загрузки фотографий и один для каждого комментатора? (влияет на messagesUser )
    • messagesTime - время создания. После вышеупомянутой проблемы, если мы не создадим новое уведомление, это поле должно быть заменено messagesUpdateTime или может существовать в стороне от него?

Я стремлюсь к меньшей сложности кода и большей эффективности базы данных. Попытка отделить слой базы данных от слоя кода озадачила меня на этой части сайта: (

Я открыт для всех проблем и идей.

Ответы [ 2 ]

1 голос
/ 10 июля 2014

Существует два способа доступа к новостной ленте:

  • разветвляется при записи
  • веер на чтение

Вы используете веер при записи. В этом случае вы создаете новую отдельную активность для каждого соответствующего пользователя.

Этот подход может взорваться очень быстро, особенно если вы разрешите пользователям иметь неограниченное количество подписчиков. Всякий раз, когда происходит какое-либо действие, которое вам случается, вам придется сохранять новую запись для каждых 1000+ подписчиков в базе данных.

Все становится сложнее, когда вы добавляете группы и разные типы аудиторий. Что, если вы теперь хотите транслировать действие только людям из группы A, но не из группы B (например, вы создаете статус и хотите ограничить зрителей)? Что происходит, когда вы хотите транслировать на группу A и группу B, но есть пользователи A и B, которым вы не хотите получать одно и то же действие дважды? Что если вы хотите изменить видимость действия после его создания?

Это на самом деле невозможно, если фанат на подходе к записи, или, по крайней мере, очень сложно. Вот почему я предпочитаю последнее - фанат на подходе чтения.

Учтите это:

У пользователя есть набор каналов новостной ленты, связанных с его идентификатором. Эти каналы имеют вид {{ object_name}}:{{ object_id }}. Вы можете иметь отдельные наборы для новостной ленты и уведомлений, так что вы можете отменить уведомления для одного объекта, не удаляя его из своей ленты новостей.

Когда пользователь регистрируется для получения обновлений от объекта, он добавляет канал, связанный с объектом, в свой список каналов. Вы можете использовать простой набор Redis. Например, если я присоединяюсь к событию № 1, я добавляю event:1 в свой список каналов.

Когда атрибут изменяется в событии # 1, новое действие создается только один раз. У этого действия есть поле под названием «наблюдатель», которое является названием канала, которому он виден. В этом случае наблюдателем является 'событие: 1`.

Когда пользователь получает свой канал активности, он сначала получает список своих подписанных каналов. Затем они извлекают все элементы канала активности, где наблюдатель находится в своем списке каналов.

ТАКЖЕ

Я просто не совсем уверен, как превратить это в систему уведомлений. Используя веер при чтении, у меня есть набор каналов для уведомлений, как описано выше. Когда атрибут объекта изменяется, я записываю новое уведомление в базу данных, которую получают все подписанные пользователи. Единственная проблема: как бы я читал уведомления для каждого пользователя? Я до сих пор не понял эту часть.

1 голос
/ 21 января 2011

После нескольких дней перерыва я изменил свое мнение о ленте новостей и системе уведомлений. Я использую подход, при котором каждое событие (комментарий, тег и т. Д.) Запускает одно уведомление о двух пользователях, об актере и пользователе, на которого направлено уведомление (например, о тегировании и теге). Новостная лента в другой части будет принимать разумные недавние записи из записей уведомлений (при условии, что это не личное, например, личное сообщение) и создавать ленту новостей. Это может показаться напряженным для базы данных, но я не думаю, что это будет проблемой в случае со 100 (макс.) Пользователями. Спасибо за вклад Райан:)

...