[Hacking-es] Relación muchos a muchos con base de datos NoSQL

Gonzalo Rodríguez-Baltanás Díaz
Thu Feb 3 14:51:17 GMT 2011


Complementando la excelente respuesta de Lorenzo:

La documentación de la rama 2.0 está disponible en https://github.com/mongoid/mongoid-site/tree/redesign

El 03/02/2011, a las 15:43, Lorenzo Tello Ochoa escribió:

> Hola Aitor:
> 
> uso mongoid en mi proyecto y, aunque aún no he podido comprobar su rendimiento en producción (y por tanto, no tengo una opinión bien fundamentada)  con una gran masa de datos, sí, te puedo decir algo sobre mi experiencia:
> 
> - Mongoid está en pleno movimiento en estos días para sacar la versión 2.0 definitiva. Durran está reescribiendo mucho, mucho código. Hay divergencias en como se debería comportar en ciertas circunstancias y ésta es una de ellas.
> 
> - Por ejemplo, lo del :stored_as => :array desaparece en esta nueva versión. Me refiero sólo a la sintaxis, no así, a la técnica de almacenar en arrays las relaciones muchos a muchos. Se sustituye por references_and_referenced_in_many, así como alias methods con nombres similares a los de ActiveRecord.
> 
> - Lo que dice stackoverflow sobre este tipo de relaciones muchos a muchos en Mongoid no es nada misterioso. Es decir, por lógica, el coste adicional que tienen los writes de este tipo de asociaciones. Si en lugar de tener 3 tablas (las de las 2 entidades + la de la relación) como en un RDBMS, tenemos solo las dos de las entidades con los campos de la relación siendo sendos arrays con los ids foraneos, al escribir una nueva relación, tendremos que salvarlo tanto en el array de una entidad como en el de la otra. A cambio nos ahorramos una tabla. Esto es cuando en ambas entidades hacemos references_and_referenced_in_many:
> 
> class Ca
>   include Mongoid::Document
> 
>   references_and_referenced_in_many :cbs, inverse_of: :cas
> end
> 
> class Cb
>   include Mongoid::Document
> 
>  references_and_referenced_in_many :cas, inverse_of: :cbs 
> end
> 
> En este caso, al hacer ca.cbs, hace una consulta en la tabla Cb tipo... 'dame todas los registros cuyo campo ca_ids (Array) contengan  ca.id'.
> La consulta inversa es exactamente igual pero a la inversa.
> Se pueden definir algunas opciones que te permiten o no validar la otra entidad al savar la primera, salvar directamente una al salvar la otra, etc...
> 
> Pero lo que no dice el artículo es que también existe la opción de hacer:
> 
> class Ca
>   include Mongoid::Document
> 
>   references_and_referenced_in_many :cbs, inverse_of: :cas
> end
> 
> class Cb
>   include Mongoid::Document
> 
>  references_many :cas, inverse_of: :cbs 
> end
> 
> en cuyo caso..., el array solo se crea en la primera entidad y nada en la segunda.
> De modo que la consulta anterior ca.cbs se convierte en... Tabla Cb, 'dame todos los registros cuyo id esté incluido en ca.cb_ids(Array).
> La consulta inversa es igual que en el caso anterior: Tabla Ca, 'dame todos los registros cuyo campo cb_ids(Array) incluya cb.id
> 
> Aquí, al savar una nueva relación solo tenemos que modificar el array de la entidad Ca. Es decir, tocar solo una tabla y no las dos.
> 
> No se si te he liado más o te sirve de algo todo ésto. 
> 
> Por último, decirte que la documentación que hay en mongoid.org no se ajusta en nada a la nueva versión y que Durran la actualizará en cuanto tenga estable el código de la 2.0
> 
> Saludos
> 
> Lorenzo Tello
> 
> 
> 
> 
> 
> El 02/02/2011, a las 20:35, Aitor Fernandez escribió:
> 
>> Hola
>> 
>> Había llegado hasta este hilo en stackoverflow <http://stackoverflow.com/questions/3332093/how-to-implement-mongoid-many-to-many-associations> y me ha llamado la atención los comentarios indicando que en una relación muchos a muchos hacer por ejemplo con mongoid un 
>> 
>> references_many :bla_bla_bla, :stored_as => :array, :inverse_of => :bla
>> 
>> indican que es extremadamente lento.
>> 
>> Imagino que esto es solo cuando tienes miles de registros en la base de datos, aun así me gustaría saber vuestras opiniones sobre como tratar estas relaciones muchos a muchos con bases de datos NoSQL (Ya sea mongo, couchdb, Tokyo o cualquier otra)
>> 
>> Un saludo.
>> _______________________________________________
>> Hacking-es mailing list
>> Hacking-es at lists.simplelogica.net
>> http://lists.simplelogica.net/mailman/listinfo/hacking-es
> 
> _______________________________________________
> Hacking-es mailing list
> Hacking-es at lists.simplelogica.net
> http://lists.simplelogica.net/mailman/listinfo/hacking-es

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.simplelogica.net/pipermail/hacking-es/attachments/20110203/789d512f/attachment.htm 


More information about the Hacking-es mailing list