2010-05-14 26 views
12

Estoy diseñando un sistema de noticias usando PHP/MySQL similar a Facebook.PHP News Feed Database & Design

He hecho una pregunta similar antes pero ahora he cambiado el diseño y estoy buscando comentarios.

ejemplo de noticias:

user_a comentado nuevo álbum Usuario_B 's.

"Hey man nice pictures!" 

Usuario_B añadió una nueva Foto a [él/ella] perfil.

 [show photo thumbnail] 

Inicialmente, he implementado esto utilizando columnas excesivos para Obj1: Tipo 1 | Obj2: Type2 | etc.

Ahora el diseño se configura con un par de palabras clave especiales y relaciones actor/receptor. Mi base de datos utiliza una tabla de mensajes se unió en una tabla que contiene ID de usuario, ActionID, receiverid, receiverObjectTypeID,

Aquí es una versión condensada de lo que se verá como una vez unido:

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 

% a = User_ID de la persona que realiza la acción

% r = el objeto receptor

% o = el propietario del objeto receptor (por ejemplo, el propietario del álbum) (NULL si% r es un usuario)

Preguntas:

  1. Es esta una manera inteligente (eficiencia/escalable) para seguir adelante?

  2. ¿Cómo puedo almacenar una "Vista previa del evento"? Por ejemplo, si quiero mostrar el comentario que User_A hizo a User_B (como arriba, y en el feed de noticias de Facebook). He considerado utilizar una copia codificada de solo los datos relevantes ... por ejemplo, codificación JSON del texto del comentario o foto html ... pero parece frágil (el usuario puede eliminar la foto mientras está todavía en el feed de otros usuarios)

  3. ¿Cómo puedo mostrar mensajes como: "User_B agregó 4 nuevas fotos a su perfil ". con miniaturas de las fotos?

Respuesta

10

Después de haber construido algo similar recientemente, una cosa que sugeriría es separar la idea de cómo almacenar los datos del rendimiento. En mi caso, los usuarios necesitan poder volver atrás y mirar noticias de cualquier período de tiempo, por lo que las suposiciones de Arnorhs no funcionan (independientemente, no hay razón para almacenar HTML si no tiene que - dejar el formateo afuera).

Lo que encontré fue que guardo las cosas en un par de clases, ActivityType y Activity. ActivityType contiene el formato del mensaje (como su '%a commented on %o's new %r') y un indicador de si representa actividad real o un comentario sobre la actividad de otra persona (para saber a qué objeto vincular, la actividad del actor o el actor de la actividad comentada) y Activity almacena el actor, la víctima, la clave principal del objeto, una clave principal para el objeto comentado, si existe y la marca de tiempo de cuando ocurrió.

Lo cual es genial y da como resultado datos bien normalizados. Lo cual se ralentiza tan pronto como tienes media docena de amigos (el rendimiento se complica por el hecho de que todo se basa en la ubicación, así que estoy buscando la distancia que cada usuario que está lejos de ti). Todo el mundo está buscando una excusa para jugar con los sistemas de almacenamiento NoSQL ahora, pero esta es realmente una buena. Tendrá que desnormalizar el infierno de los datos para obtener un rendimiento decente de una base de datos relacional. Y las cosas son difíciles de almacenar debido a las diversas intersecciones de las relaciones. Piensa en almacenar los datos en MySQL pero recuperarlos de un sistema de almacenamiento NoSQL.

+0

Gracias tom, estoy comenzando a investigar NoSql según sus sugerencias. ¿Hay algún artículo u otro recurso que pueda ser útil para comprender/implementar dicha estrategia? Además, ¿tendré que reestructurar la base de datos relacional existente para acomodar la recuperación de NoSql? – pws5068

+1

Tengo algunos marcadores en http://delicious.com/yerfatma/nosql - el último en la lista dice ser "lectura obligatoria NoSQL". La base de datos y la tienda nosql son dos cosas separadas. No necesitan conocerse el uno al otro en absoluto. La idea es que saque sus datos del DB lo más pocas veces posible; una vez que tenga los datos en código PHP, colóquelos en la tienda nosql para que pueda recuperarlos desde allí hasta que se invaliden. – Tom

+0

Esto está mucho más claro ahora, continuaré mi investigación. Gracias por tu ayuda – pws5068

1
  1. Sí, es la forma en la estopa para seguir adelante con esto. Esos son mensajes que viven por un tiempo muy corto, por lo que nunca tendrá que actualizarlos en el tiempo si realiza cambios en el código HTML del mensaje que almacena, etc. Por lo tanto, debe estar en forma utilizando esto.

  2. Simplemente use el HTML simple.Será rápido y no habrá relaciones que tendrá que aplicar más adelante, nunca tendrá que ser capaz de actualizar esas o cosas por el estilo.

Editar: en realidad no he entendido bien, yo no sabía que pretendía los% s-cosas para ser una notación especial para qué objetos está haciendo referencia. Simplemente colocaría notificaciones HTML simples en ese texto.

+1

Almacenar el html para vincular cada objeto y previsualizar cada acción (y vincular cada imagen) parece frágil. Si el usuario cambia o elimina su imagen, la base de datos almacena el enlace roto – pws5068

+0

Mi diseño anterior trata de aproximar eso tanto como sea posible, mientras separa la información sobre Objetos que pueden cambiar con reemplazos especiales ... pero probablemente haya una más tradicional (mejor) forma – pws5068

+0

puede parecer "frágil" (nunca antes se había visto esa palabra, interesante) pero el hecho es que las posibilidades de que eso ocurra desde que la actividad sucedió y hasta que el usuario vea la notificación es mínima, también, ¿por qué mencionas? imágenes? Estamos hablando de notificaciones, similares a las de FB? Así que esa es una identificación de usuario/usuario, y su imagen probablemente solo se solicite a la ID/usuario, de todos modos no estaría haciendo referencia a un nombre de archivo. – arnorhs

1

Cuando habla de Facebook, debe pensar en emisor y receptor.

Diga cuando usted quiere ver todos los mensajes/alimentaciones a B? entonces debes disparar una consulta ¿no? Creo que su tabla parece estar bien, pero también agregue una columna para la ID de la persona receptora. Puede ser que puedas mantener eso en una mesa separada.

De modo que usted puede encontrar fácilmente todos los feeds para el usuario B O del usuario B O del usuario A al usuario B

esperanza que esto podría ser útil para usted.

Pero ignore esto si solo desea concentrarse en las transmisiones. entonces solo quieres las últimas. Lo que pensé es w.r.t. Facebook donde podemos ver el perfil de alguien con paredes que obtuvo de diff. usuarios.

gracias.

3

Tengo un problema similar y pregunta similar aquí en Stackoverflow - nuestras preguntas casi el mismo aspecto :) Check it - getting JSON data-tree from MySQL

Pero yo estoy tratando de resolver el problema en un pequeño enfoque diferente: Soy creando objetos JSON. Así que mi mesa de suministro de noticias tiene el siguiente aspecto:

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!"} 

Luego uso json_decode en php para crear matrices. Luego, dependiendo de news_type creo el HTML necesario.