2012-07-06 4 views
9

Ich schreibe eine Web-Anwendung mit PHP/Symfony2/Doctrine2 und nur die Fertigstellung der Datenbank-Design. Wir müssen diese Objekte (zB Projekte, Lieferanten) in unsere Datenbank importieren, die von verschiedenen Kunden mit verschiedenen Feldern kommen. Einige Kunden haben 2 Felder im Projektobjekt und einige haben 20. Also habe ich darüber nachgedacht, sie in MongoDB zu implementieren, da es wie ein guter Zweck dafür scheint.Mix von MySQL und Mongodb in einer Anwendung

Symfony2 unterstützt sowohl ORM als auch ODM, so dass dies kein Problem sein sollte. Nun ist meine Frage, wie man die Integrität der Daten in beiden Datenbanken sicherstellen kann. Weil Objekte in meiner MySQL db müssen irgendwie mit den Objekten in der MongoDB für Integritätsprobleme verknüpft werden.

Gibt es bessere Lösungen? Jede Hilfe/Gedanken würden geschätzt

+0

Denken Sie daran, dass jemand die zwei verschiedenen Datenbanken * bedienen * muss, nachdem Sie mit dem Schreiben des Codes fertig sind (Verwalten von Backups, Sicherheitspatches usw.). Ich würde keine zweite Datenspeichertechnologie in ein Projekt einführen, nur weil es sich gut anfühlt, aber nur dann, wenn der Nutzen all dieser Kosten überwiegt. –

Antwort

8

Bulat eine Lehre Erweiterung implementiert, während wir bei OpenSky waren nach Referenzen zwischen MongoDB Dokumenten und MySQL Aufzeichnungen Handhabung, die derzeit in ihrem (zugegebenermaßen veraltet) fork des DoctrineExtensions Projekt sitzen. Sie sollten sich entweder die orm2odm_references oder openskyfork Filialen ansehen. Damit dies in Ihrem Projekt verwendet werden kann, möchten Sie es wahrscheinlich auf eine neue Version von DoctrineExtensions portieren oder den Code einfach in Ihre Anwendung integrieren. Leider gibt es außer dem Code selbst keine Dokumentation.

Zum Glück gibt es auch cookbook article auf der Doctrine-Website, die beschreibt, wie Sie dies von Grund auf neu implementieren. Grundsätzlich verlassen Sie sich auf einen Ereignis-Listener, um Ihre Eigenschaft durch eine Referenz (d. H. Nicht initialisiertes Proxy-Objekt) von dem anderen Objektmanager zu ersetzen, und das natürliche Verhalten von Proxy-Objekten, um sich selbst zu laden, kümmert sich um den Rest. Wenn der Ereignis-Listener ein Dienst ist, können Sie einfach sowohl den ORM- als auch den ODM-Objektmanager in ihn einfügen.

Die einzige durch dieses Modell garantierte Integrität besteht darin, dass Sie Ausnahmen erhalten, wenn Sie versuchen, eine schlechte Referenz zu hydratisieren, was wahrscheinlich mehr ist, als wenn Sie einfach eine ID der anderen Datenbank speichern und manuell abfragen.

+2

Dieser Blog beschreibt eigentlich, wie es umgesetzt wird: http://jwage.com/2010/08/25/blending-the-doctrine-orm-and-mongodb-odm/ Danke! –

+0

Das ist eigentlich der gleiche Inhalt wie der Kochbuchartikel, den ich verlinkt habe. Jon Wage hat es nach dem Schreiben des Blogartikels in die Dokumentation geschafft :) – jmikola

+0

Yeap habe ich gemerkt :) –

4

Also die Art, wie wir dieses Problem gelöst haben, war der Umzug nach Postgres. Postgres hat einen Datentyp namens hstore, der sich wie eine NoSQL-Spalte verhält. Funktioniert recht süß

UPDATE

Jetzt, wo ich bin auf der Suche zurück, gehen Sie mit jsonb statt json oder hstore, wie es Ihnen mehr eine Datenstruktur als ein Schlüssel-Wert-Speicher haben kann.

Verwandte Themen