2012-07-06 14 views
9

Sto scrivendo un'applicazione Web utilizzando PHP/Symfony2/Doctrine2 e sto semplicemente terminando la progettazione del Database. Dobbiamo importare questi oggetti (ad esempio progetti, fornitori) nel nostro database che provengono da diversi clienti con una varietà di campi. Alcuni clienti hanno 2 campi nell'oggetto del progetto e alcuni ne hanno 20. Quindi stavo pensando di implementarli in MongoDB poiché sembra un buon uso per questo.Mix di MySQL e Mongodb in un'applicazione

Symfony2 supporta sia ORM che ODM, quindi non dovrebbe essere un problema, ora la mia domanda è come garantire l'integrità dei dati in entrambi i database. Perché gli oggetti nel mio MySQL db devono essere collegati in qualche modo agli oggetti in MongoDB per problemi di integrità.

Ci sono soluzioni migliori là fuori? Qualsiasi aiuto/pensieri sarebbe apprezzato

+0

Ricordare che qualcuno dovrà * utilizzare * i due diversi database dopo aver finito di scrivere il codice (gestire backup, patch di sicurezza, ecc.). Non introdurrei una seconda tecnologia di archiviazione dei dati in un progetto solo perché mi sembra una buona idea, ma solo se il vantaggio di farlo supera tutti i costi. –

risposta

8

Bulat implementato un'estensione Dottrina mentre eravamo a OpenSky per la gestione di riferimenti tra documenti MongoDB e record di MySQL, che è attualmente seduti nelle loro (certamente obsoleto) fork del progetto DoctrineExtensions. Avrai voglia di guardare i rami orm2odm_references o openskyfork. Affinché questo sia utilizzabile nel tuo progetto, probabilmente vorrai portarlo su un nuovo fork di DoctrineExtensions, o semplicemente incorporare il codice nella tua applicazione. Sfortunatamente, non c'è documentazione a parte il codice stesso.

Per fortuna, c'è anche cookbook article sul sito Web di Doctrine che descrive come implementare questo da zero. Fondamentalmente, ci si basa su un listener di eventi per sostituire la proprietà con un riferimento (ovvero oggetto Proxy non inizializzato) dall'altro gestore oggetti e il comportamento naturale degli oggetti Proxy da caricare pigramente si prende cura del resto. Se il listener di eventi è un servizio, è possibile iniettare facilmente sia gli object manager ORM che ODM.

L'unica integrità garantita da questo modello è che si riceveranno delle eccezioni quando si tenta di idratare un riferimento errato, che è probabilmente più di quanto si otterrebbe semplicemente memorizzando un ID dell'altro database e interrogando manualmente.

+2

Questo blog descrive in realtà come è implementato: http://jwage.com/2010/08/25/blending-the-doctrine-orm-and-mongodb-odm/ Grazie! –

+0

Questo è in realtà lo stesso contenuto dell'articolo di ricettario che ho collegato. Jon Wage l'ha commissionato alla documentazione dopo aver scritto l'articolo del blog :) – jmikola

+0

Yeap ho notato :) –

4

Quindi il modo in cui abbiamo risolto questo problema è stato il passaggio a Postgres. Postgres ha un tipo di dati chiamato hstore che funziona come una colonna NoSQL. Funziona piuttosto dolce

UPDATE

Ora che sto guardando indietro, andare con jsonb invece di json o hstore in quanto permette di avere più di una struttura di dati di un negozio di valori-chiave.

Problemi correlati