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.
EDIT: No he estado aquí en este sitio últimamente y acabo de descubrir que esta respuesta ha sido desestimada. Bueno, aquí hay un example post with like count and their avatars. 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 gustos 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 de "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 entiendo por qué de esta respuesta se bajan los votos de algunos usuarios 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.
Eso podría ser una solución, creo que el problema es que "everyhing" debe ser un "Item" porque ¿qué pasa si tienes una tabla que no es un Item y algún día quieres un Me gusta también para eso ?. Creo que a veces cuanto más simple es mejor, ¿por qué no hacer la herencia opuesta? al igual que el padre y usted tiene una tabla like_for_status con un estado FK, y like_for_photo, etc. puede extenderla fácilmente a cualquier tabla, y sus consultas también son más rápidas. – Enrique
+1, aunque creo que te refieres a ** Tabla por tipo ** o TPT. – Yuck
@Yuck: Sí, TPT (en lugar de Table-Per-Hierarchy), aunque TPT y TPH son, hasta donde sé, parte del léxico de Entity Framework en lugar de ser más genéricamente SQL. –