2010-05-14 3 views
12

Я разрабатываю систему новостей, используя PHP/MySQL, похожую на facebook.PHP News Feed Database & Design

Я задал аналогичный вопрос раньше, но теперь я изменил дизайн, и я ищу обратную связь.

Пример новости:

прокомментировал Пользователь A на Пользователь B «s новый альбом .

"Hey man nice pictures!" 

Пользователь B добавил новый ФОТО на [его/ее] профиль.

 [show photo thumbnail] 

Первоначально я осуществил это, используя избыточные столбцы для obj1: Type1 | Obj2: Type2 | и т. д.

Теперь дизайн настроен с использованием нескольких специальных ключевых слов и отношений с актерами/приемниками. Моя база данных использует таблицу сообщений сдвинуты по таблице, содержащей идентификатор пользователя, ActionId, receiverid, receiverObjectTypeID,

Вот сокращенный вариант того, что он будет выглядеть, как только присоединился:

News_ID | User_ID |     Message     |  Timestamp 

    2643  A  %a commented on %o's new %r.     SomeTimestamp 
    2644  B  %a added a new %r to [his/her] profile.   SomeTimestamp 

% а = с user_id из человек делает действие

% г = принимающий объект

% о = владелец принимающего объекта (например, владелец альбома) (NULL, если% г является пользователем)

Вопросы:

  1. Является ли это умный (эффективный/масштабируемый) способ двигаться вперед?

  2. Как я могу сохранить «Предварительный просмотр события»? Например, если я хочу показать комментарий, который User_A сделал для User_B (например, выше и на ленте новостей facebook). Я рассмотрел использование закодированной копии только соответствующих данных .. например, JSON, кодирующий текст комментария или фото html .. но это кажется хрупким (пользователь может удалить фотографию, пока она еще находится в другом канале пользователя)

  3. Как я могу показать такие сообщения, как: «Пользователь_B добавил 4 новых фотографии в свой профиль ». с эскизами фотографий?

ответ

10

Построив что-то подобное совсем недавно, я хотел бы предложить, чтобы отделить идею хранения данных от производительности. В моем случае пользователи должны иметь возможность вернуться и посмотреть новости из любого периода времени, поэтому предположения arnorhs не работают (несмотря на то, что нет причин хранить HTML, если вам не нужно ... оставить форматирование снаружи).

Что я нашел, так это то, что я храню материал в нескольких классах, ActivityType и Activity. ActivityType содержит формат сообщения (например, ваш '%a commented on %o's new %r') и индикатор того, представляет ли он фактическую активность или комментарий о чьей-либо деятельности (так что я знаю, к какому объекту привязать, к действию актера или к актору проделанной деятельности) и Activity хранит актера, жертву, первичный ключ объекта, первичный ключ для объекта с комментариями, если он существует, и отметка времени, когда она произошла.

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

+0

Спасибо, я начинаю исследовать NoSql на основе ваших предложений. Есть ли статья или другой ресурс, который может оказаться полезным для понимания/реализации такой стратегии? Кроме того, мне нужно будет реструктурировать существующую реляционную базу данных для поиска NoSql? – pws5068

+1

У меня есть несколько закладок на http://delicious.com/yerfatma/nosql - последний в списке утверждает, что это «NoSQL Required Reading». База данных и магазин nosql - это две разные вещи. Им совсем не нужно знать друг о друге. Идея заключается в том, что вы получаете данные из базы данных в кратчайшие сроки; после того, как у вас есть данные в PHP-коде, кешируйте его в магазине nosql, чтобы вы могли вернуть его туда, пока он не станет недействительным. – Tom

+0

Теперь это намного яснее, я продолжу свое исследование. спасибо за помощь – pws5068

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

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

Edit: Я на самом деле не понял, что я не знаю, что вы предназначены% тех, S-то, чтобы быть некоторые специальные обозначения для того, что объекты, которые вы ссылаетесь. Я бы просто разместил простые текстовые уведомления в этом тексте.

+1

Хранение html, чтобы связать каждый объект и просмотреть каждое действие (и связать каждое изображение), кажется хрупким. Если пользователь меняет или удаляет свое изображение, база данных хранит неработающую ссылку – pws5068

+0

Мой проект выше пытается максимально приблизить это, разделяя информацию об объектах, которые могут меняться с помощью специальных заметок .. но, вероятно, существует более традиционная (лучше) – pws5068

+0

это может показаться «хрупким» (никогда не видел этого слова раньше, интересно), но факт в том, что шансы на то, что происходит с того момента, когда произошло действие, и пока пользователь не увидит уведомление, минимальны, также, почему вы упоминаете изображений? Мы говорим о уведомлениях, похожих на FB? Таким образом, это имя пользователя/пользователя, и ваше изображение, возможно, просто запрашивается у ID/пользователя, вы не будете ссылаться на имя файла в любом случае. – arnorhs

1

Когда вы говорите о Facebook, вы должны подумать о отправителе и получателе.

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

Так что вы можете легко найти все каналы для пользователя B ИЛИ от пользователя B ИЛИ от пользователя А к пользователю В

надеюсь, что это может быть полезным для вас.

Но игнорируйте это, если хотите сосредоточиться только на фидах. то вам нужны только последние. Я думал, что w.r.t. facebook, где мы можем увидеть профиль человека со стенами, которые он получил от diff. пользователи.

спасибо.

3

У меня аналогичная проблема, и подобный вопрос здесь, на Stackoverflow - наши вопросы выглядят почти одинаково :) Проверьте это - getting JSON data-tree from MySQL

Но я пытаюсь решить эту проблему в небольшой другой подход: я создавая объекты JSON. Так что мой стол лента выглядит следующим образом:

news_type | datetime_added | params 
------------+-----------------+-------------------------------------------------------- 
new_photos | 2010.12.01  | {user_id: "12", photo_id: "26", photo_url: "/images/photo.jpg"} 
new_comment | 2010.12.01  | {owner_id: "12", photo_id: "26", photo_url: "/images/photo.jpg", commenter_id: 25, comment_text: "Nice!"} 

Затем я использую json_decode в PHP для создания массивов. Тогда в зависимости от news_type я создаю необходимый HTML.