2011-05-31 8 views
18

Me preguntaba ¿cuál es la mejor manera de almacenar datos de relaciones de amigos usando MongoDB?¿Almacena relaciones de amigos en MongoDB?

Viniendo de mysql Tenía una mesa separada con relaciones de amigos que tenían dos claves externas, cada una señalando a un amigo en la "amistad", sin embargo, con MongoDB es posible tener matrices de referencias o incluso documentos incrustados. la mejor forma de almacenar estas relaciones

La primera reacción inmediata fue que almacenaba un conjunto de identificadores de objeto amigo en cada usuario, sin embargo, eso me preocupa, porque entonces, para eliminar una "amistad", tendría para hacer eliminaciones en los documentos de ambos amigos, mientras que si almacenaba la relación en una colección separada (a la SQL) podría eliminar o agregar una relación simplemente modificando una colección.

Gracias!

+0

Lo que está describiendo es mucho más adecuado para un RDBMS de tradiciones en lugar de una oferta de esquema inferior. Sería mucho más fácil si usabas un RDBMS. ¿Alguna razón en particular por la que elegiste a mongo? – JohnP

+0

Hola John, para amigos, definitivamente estoy de acuerdo. Elegí a Mongo debido a los datos no estructurados que estaría almacenando relacionados con los amigos. En particular, cosas como el etiquetado y la capacidad de insertar matrices/referencias en un campo fue muy bueno también para cosas como almacenar comentarios, etc. –

+0

Sé que probablemente tengas corazón puesto en MongoDB (me encanta), pero probablemente quieras una base de datos de gráficos para esto. – EhevuTov

Respuesta

26

Mantener una lista de friend_ids en un usuario, es lo que voy a recomendar. Algunas razones,

1.Le preguntas a un usuario y tienes una lista de todos los amigos disponibles por adelantado.

2.Las solicitudes (pendientes, aceptadas) también se pueden gestionar, al ver que los respectivos identificadores deben estar presentes en la lista de amigos del usuario. Por lo tanto, puedo obtener la lista de amigos reales y aceptadas mediante la consulta

my_id, my_friend_ids = user._id, user.friend_ids 
my_friends = db.users.find({'_id':{'$in': my_friend_ids}, 'friend_ids': my_id}) 

Sí, mientras se quita una amistad, que tiene que $pull de amigo-lista, tanto de los usuarios, pero la frecuencia de la que sería mucho menos. Pero consulta menos para obtener la lista de amigos, que se usaría con frecuencia.

+0

Suena bien, iré con eso por ahora ... tiene sentido. ¡Gracias! –

+0

Excelente respuesta, ... "pero la frecuencia para eso sería mucho menor" ... Bien, se explica ... ¡gracias! – dsignr

+0

@simplyharsh ¿cuál sugieres embedmany o referencia muchos? –

Cuestiones relacionadas