2012-07-06 14 views
9

Estoy escribiendo una aplicación web usando PHP/Symfony2/Doctrine2 y acabando de terminar el diseño de la base de datos. Tenemos que importar estos objetos (por ejemplo, Proyectos, Vendedores) a nuestra base de datos que provienen de diferentes clientes con variedad de campos. Algunos clientes tienen 2 campos en el objeto del proyecto y algunos tienen 20. Así que estaba pensando en implementarlos en MongoDB, ya que parece ser un buen uso.Mezcla de MySQL y Mongodb en una aplicación

Symfony2 admite tanto ORM como ODM, por lo que no debería ser un problema. Ahora mi pregunta es cómo garantizar la integridad de los datos en ambas bases de datos. Debido a que Objetos en mi MySQL db necesitan estar vinculados de alguna manera a los objetos en el MongoDB por problemas de integridad.

¿Hay alguna solución mejor? Cualquier ayuda/pensamiento sería apreciado

+0

Tenga en cuenta que alguien tendrá que * operar * las dos bases de datos diferentes después de que haya terminado de escribir el código (administrar copias de seguridad, parches de seguridad, etc.). No introduciría una segunda tecnología de almacenamiento de datos en un proyecto simplemente porque se siente como una buena opción, pero solo si el beneficio de hacerlo supera todos los costos. –

Respuesta

8

Bulat implementó una extensión Doctrina mientras estábamos en OpenSky para el manejo de referencias entre documentos y registros MongoDB MySQL, que actualmente está sentado en su (la verdad es obsoleta) fork del proyecto DoctrineExtensions. Deberá consultar las ramas orm2odm_references o openskyfork. Para que esto se pueda utilizar en su proyecto, probablemente quiera transferirlo a una nueva bifurcación de DoctrineExtensions, o simplemente incorporar el código en su aplicación. Lamentablemente, no hay documentación aparte del código en sí.

Afortunadamente, también hay cookbook article en el sitio web de Doctrine que describe cómo implementar esto desde cero. Básicamente, usted confía en un oyente de eventos para reemplazar su propiedad con una referencia (es decir, un objeto Proxy no inicializado) del otro administrador de objetos y el comportamiento natural de los objetos Proxy para cargarse ellos mismos se ocupa del resto. Siempre que el detector de eventos sea un servicio, puede insertar fácilmente tanto los administradores de objetos ORM como ODM en él.

La única integridad garantizada por este modelo es que recibirá excepciones cuando intente hidratar una referencia incorrecta, que probablemente sea más de lo que obtendría almacenando simplemente una ID de la otra base de datos y consultando manualmente.

+2

Este blog en realidad describe cómo se implementa: http://jwage.com/2010/08/25/blending-the-doctrine-orm-and-mongodb-odm/ ¡Gracias! –

+0

Ese es en realidad el mismo contenido que el artículo del libro de cocina que he vinculado. Jon Wage lo comprometió con la documentación después de escribir el artículo del blog :) – jmikola

+0

Yeap Me di cuenta :) –

4

Así que la manera en que resolvimos este problema fue moviéndonos a Postgres. Postgres tiene un tipo de datos llamado hstore que actúa como una columna NoSQL. Funciona bastante dulce

ACTUALIZACIÓN

Ahora que estoy mirando hacia atrás, ve con jsonb en lugar de json o hstore ya que le permite tener más de una estructura de datos de un almacén de claves-valor.