2009-06-29 10 views
6

En linkedin, cuando visita el perfil de alguien, puede ver cómo está conectado a ellos. Creo que linkedin muestra hasta conexiones 3er nivel, si no más, algo así como¿Cómo modelar esto [Redes, detalles en la publicación] en la base de datos para mayor eficiencia y facilidad de uso?

shabda -> usuario Foo, el usuario bar, baz de usuario -> Conexión de Joel -> Joel

¿Cómo se puede representar esto en la base de datos.

Si modelo como,

 

User 
    Id PK 
    Name Char 

Connection 
    User1 FK 
    User2 FK 

Luego de encontrar la red, tres niveles de profundidad, tengo que obtener toda mi conexión, sus conexiones y sus conexiones, y luego ver si el usuario actual es que hay . Obviamente, esto sería muy ineficiente con DB de cualquier tamaño, y probablemente también sea un poco complicado trabajar con él.

Dado que, vinculado en esta red puedo verlo, en cualquier perfil que visite, tampoco creo que esto se haya calculado previamente.

La otra cosa que me viene a la mente es que probablemente esto no se almacena en una base de datos relacional, pero ¿cuál sería la mejor manera de almacenarla y recuperarla?

+0

Una gran pregunta, creo que esto beneficiará a mucha gente. +1 –

Respuesta

5

Mi recomendación sería utilizar una base de datos de gráficos. Parece que hay una sola implementación actualmente disponible, y eso es Neo4j. Está escrito en Java, pero tiene enlaces a Ruby y Scala (Python en progreso).

Si no conoce Java, probablemente no podrá encontrar nada similar en ninguna otra plataforma (todavía), desafortunadamente. Sin embargo, si conoce Java (o al menos está dispuesto a aprender), vale la pena. (Técnicamente, ni siquiera necesita aprender Java debido a los enlaces de Ruby/Python.) Neo4j fue creado para exactamente lo que está tratando de hacer. Tendría muchos problemas tratando de implementar esto en una base de datos relacional, cuando sería capaz de hacer exactamente lo mismo en unas pocas líneas de código Java, y también de manera mucho más eficiente.

Si no es una opción, aún así recomendaría buscar en otros tipos de bases de datos como object databases. Las bases de datos relacionales no se crearon para este tipo de cosas, y usted sufriría más al tratar de hacerlo en un RDBMS que cambiando a un tipo diferente de base de datos y aprendiendo.

+0

Gracias, eso era lo que estaba pensando también. Iused para trabajar en Java, unos años atrás, con suerte no se han oxidado por completo, y se puede usar de forma adecuada. – agiliq

+0

Para ser sincero, nunca antes había trabajado con Java y encontré a Neo4j muy directo. Entonces estarás bien. :) –

+1

Encontrarás información sobre las vinculaciones de idiomas para Neo4j en la wiki: http://wiki.neo4j.org/. También puede crear una API RESTful específica de dominio en Ruby o Scala (hay enlaces en la wiki) si le conviene a su aplicación. – nawroth

3

No veo por qué hay algo de malo en usar una base de datos relacional para esto. Las tablas definidas en la pregunta son un excelente comienzo. Con la optimización adecuada, podrá mantener su rendimiento a mano. Personalmente creo que necesitarías algo serio para justificarte al alejarte de un producto convencional tan versátil. Probablemente necesite un RBDMS en el proyecto de todos modos y hay una cantidad inigualable de opciones legítimas en muchos rangos de precios (incluso gratis). Obtendrá documentación de calidad, habrá asistencia disponible y tendrá una gran oferta de desarrolladores altamente capacitados disponibles en el grupo de trabajos.

Respecto a este modelo de auto-relaciones (los usuarios se unieron a otros usuarios), recomiendo investigar las consultas recursivas. Eso evitará que realice una cascada de consultas individuales para encontrar 3 niveles de relaciones. Considere el siguiente método de SQL Server para realizar consultas recursivas con CTE.

http://msdn.microsoft.com/en-us/library/ms186243.aspx

Se le permite especificar la profundidad que desea ir con la indirecta MAXRECURSION.

A continuación, debe comenzar a pensar en formas de optimizar.Esto comienza con las mejores prácticas estándar para configurar sus tablas con los índices y el mantenimiento adecuados, etc. Finaliza inevitablemente con denormalization. Esa es una de esas cosas que solo haces una vez que ya has probado todo lo demás, pero si sabes lo que estás haciendo y usas buenas prácticas, entonces tu ganancia de rendimiento será significativa. Hay muchos recursos en Internet para ayudarlo a aprender acerca de la desnormalización, solo look it up.

+1

¿Por qué? Porque obtendrás un rendimiento extremadamente pobre con un RDBMS. Intenta ir más allá de 3 niveles de profundidad de las relaciones. Simplemente no puede suceder, a menos que los usuarios estén dispuestos a esperar unos segundos para que se cargue (y su servidor de base de datos puede manejarlo). Neo4j se construyó desde cero con esto en mente, y (por lo que escuché) se pueden hacer 100.000 niveles de profundidad en cuestión de unos segundos. ¿Puede un RDBMS hacer eso? –

Cuestiones relacionadas