Estructura de datos "me gusta" de Facebook
database-design facebook-like (4)
Estoy bastante seguro de que Facebook no almacena información "me gusta" como otros sugirieron usar RDBMS. Con millones de usuarios y posiblemente miles de usuarios similares, estamos buscando miles de filas para unirnos, lo que afectaría el rendimiento.
El mejor enfoque aquí es agregar todos los "me gusta" en una sola fila. Por ejemplo, una tabla con la columna user_like_id de tipo de datos de texto. Luego, se anexan todas las identificaciones a las que les gustó la publicación. En este caso, solo consultas una fila y obtienes todo. Esto será mucho más rápido que unir mesas y obtener conteos.
EDITAR: No he estado aquí en este sitio últimamente y descubrí que esta respuesta ha sido rechazada. Bueno, aquí hay una publicación de ejemplo con el recuento de me gusta y sus avatares . Este es mi diseño donde acabo de implementar lo que estoy hablando.
Los dos componentes aquí son 1.) Tabla XREF y 2.) Objeto JSON.
Los Me gusta aún se almacenan en una tabla XREF. Pero al mismo tiempo, los datos se anexan al objeto JSON y se almacenan en una columna de texto en la tabla de publicaciones.
¿Por qué almacené la información "Me gusta" en una columna de texto como JSON? De modo que no hay necesidad de hacer búsquedas / uniones de db para los "me gusta". Si alguien a diferencia de la publicación, el objeto JSON se acaba de actualizar.
Ahora no sé por qué algunos usuarios han bajado esta respuesta aquí. Esta respuesta proporciona una recuperación de datos rápida. Esto está cerca del enfoque NoSQL, que es cómo FB accede a los datos. En este caso, no hay necesidad de combinaciones / búsquedas adicionales para obtener información de Me gusta.
Y aquí está la tabla que contiene los gustos. Es solo una simple asignación de XREF entre el usuario y la tabla de elementos.
Me he estado preguntando cómo Facebook administra el diseño de la base de datos para todas las diferentes cosas que te pueden "gustar". Si hay una sola cosa para agradar, esto es simple, solo una clave externa para lo que te gusta y una clave externa para lo que eres.
Pero debe haber cientos de tablas diferentes que puede "me gusta" en Facebook. ¿Cómo almacenan los Me gusta?
Facebook no tiene claves extranjeras tradicionales y tal, ya que no usan bases de datos relacionales para la mayor parte de su almacenamiento de datos. Simplemente, no lo cortan por eso.
Sin embargo, usan varios almacenes de datos de tipo NoSQL. El "Me gusta" probablemente se atribuye en función de un servicio, probablemente configurado de manera SOA en toda su infraestructura. De esta manera, el "Me gusta" se puede atribuir básicamente a cualquier cosa que quieran que se asocie. Todo esto, con gran escalabilidad y sin problemas relacionales estrechamente relacionados con los que lidiar. Algo que Facebook, realmente no puede afrontar en el volumen que operan.
También podrían estar usando un mecanismo de procesamiento de estilo AOP (Programación Orientada a Aspectos) para "adjuntar" un "Me gusta" a cualquier cosa que pueda necesitar uno en el tiempo de renderizado de página, pero tengo la idea de que es un proceso asíncrono mediante JavaScript contra un estilo SOA servicio web u otro mecanismo de entrega.
De cualquier manera, me encantaría saber cómo tienen esta configuración desde una perspectiva de arquitectura. Teniendo en cuenta su volumen, incluso el simple botón "Me gusta" se convierte en una implementación significativa de la tecnología.
Puede tener una tabla con Id, ForeignId y Type. Tipo puede ser cualquier cosa como Foto, Estado, Evento, etc ... ForeignId sería la identificación del registro en la tabla Tipo. Esto hace posible los comentarios y me gusta. Solo necesita una tabla para todos los Me gusta, uno para todos los comentarios y el que describí.
Ejemplo:
Items
Id | Foreign Id | Type
----+-------------+--------
1 | 322 | Photo
4 | 346 | Status
Likes
Id | User Id | Item Id
----+-------------+--------
1 | 111 | 1
Aquí, al usuario con Id 111 le gusta la foto con Id 322.
Nota: Supongo que está utilizando un RDBMS, pero vea la respuesta de Adron. Facebook no usa un RDBMS para la mayoría de sus datos.
Si desea representar este tipo de estructura en una base de datos relacional, entonces necesita usar una jerarquía que normalmente se conoce como herencia de tabla. En la herencia de tablas, tiene una sola tabla que define un tipo principal , luego tablas secundarias cuyas claves primarias también son claves externas que regresan al padre.
Usando el ejemplo de Facebook, es posible que tenga algo como esto:
User
------------
UserId (PK)
Item
-------------
ItemId (PK)
ItemType (discriminator column)
OwnerId (FK to User)
Status
------------
ItemId (PK, FK to Item)
StatusText
RelationshipUpdate
------------------
ItemId (PK, FK to Item)
RelationshipStatus
RelationTo (FK to User)
Like
------------
OwnerId (FK to User)
ItemId (FK to Item)
Compound PK of OwnerId, ItemId
En la exhaustividad del interés, vale la pena señalar que Facebook no usa un RDBMS para este tipo de cosas. Han optado por una solución NoSQL para este tipo de almacenamiento. Sin embargo, esta es una forma de almacenar dicha información débilmente acoplada dentro de un RDBMS.