2011-03-05 18 views
5

Tenía curiosidad sobre cómo el complemento MongoDB para Grails manejaría las relaciones. Con el fin de probar esto me hizo una aplicación muy sencilla con dos clases de dominio:MongoDB, Grails y relaciones

Author s tienen dos campos: String firstName y String lastName

Book s tener dos campos: String title y Author author

Después de configurar MongoDB y Grails hice algunos Author sy Book y eché un vistazo utilizando el shell interactivo MongoDB. Lo que encontré es que las relaciones se manejaban de la misma manera que se manejarían en una base de datos relacional: referencias a los campos de identificación de otros objetos.

Así que ahora para las preguntas:

  1. Para que GORM para sacar esto adelante, ¿necesita una conexión separada para recuperar cada documento?
  2. En caso afirmativo, ¿no sería mejor en una base de datos relacional como PostgreSQL o MySQL?
  3. Si la respuesta a las dos preguntas anteriores es 'sí', ¿existe una forma mejor de administrar las relaciones en una base de datos de documentos como MongoDB? Me doy cuenta de que se supone que MongoDB no es relacional, pero hay algunas cosas que no veo cómo evitar las relaciones sin duplicar los datos (haciendo pesadillas de actualización).

Editar: Asimismo, sólo se dio cuenta de que griales no está clasificando correctamente en la propiedad 'id' de mis autores. ¿Tiene esto que ver con usar MongoDB? En el shell puedo ver que la propiedad _id de todos los documentos elaborados por Grails es del tipo de datos NumberLong.

Respuesta

3

que se dan cuenta de MongoDB no se supone que es relacional, pero hay algunas cosas que no veo cómo moverse relaciones sin duplicar los datos

Entonces no se preocupe. MongoDB no es anti-relacional, está orientado a documentos.

En este caso, Libros y Autores son dos objetos de nivel superior. No es razonable anidar a ninguno de ellos, ambos son entidades centrales por derecho propio.

En el caso de que cada Libro tenga solo un Autor (N: 1), es completamente razonable que el Libro contenga una "Referencia al" Autor. Seguro que tendrás que hacer dos consultas. ¿Pero eso es terriblemente diferente de hacer una consulta conjunta? La consulta de unión aún tiene que hacer dos búsquedas de índice y dos búsquedas de datos. Entonces, realmente no te estás costando nada aquí.

En el caso de cada libro que soporta múltiples autores (M: N), entonces usted ha several options en función de sus necesidades.

no me gusta pensar en MongoDB como "no relacional", creo que es más limpio que pensar en MongoDB como consulta optimizada.

También me acabo de dar cuenta de que los griales no se clasifican correctamente en la propiedad 'id' de mis autores ...

Me gustaría consultar directamente con el autor de Grails. Parece que pueden estar almacenando "cadenas" en lugar de ObjectIds reales (o MongoID). Si bien no es crítico, esto puede ser un error.

1

Con respecto a la propiedad de id, la documentación ahora muestra que puede poner una declaración de ObjectId id o String id en su clase de dominio para no usar la implementación GORM predeterminada de usar una iteración larga. Simplemente declare el campo en su clase y el complemento se encargará del resto.