2009-07-27 8 views
0

Ich habe zwei Servern:Unterstützen ORM-Frameworks datenbankübergreifende/cross-Server-Joins?

  • Ein Server: ein Schlüssel-MySql
    • Tabelle
      • Fremdschlüssel-b
  • Server B: MsSql
    • Tabelle B
      • Schlüssel-b
      • Fremdschlüssel-a

Vermutlich habe ich zwei Objekte mit Methoden, die die Beziehungen Griff:

TabelleA-> getRelatedTableB();

TabelleB-> getRelatedTableA();

Dies ist in den meisten ORMs einfach zu implementieren. Aber was, wenn ich eine große Menge von Objekten mit nur einer Abfrage pro Datenbankserver bekommen möchte? Idealerweise würde das Framework dies abstrahieren und den logischen Join durchführen, so dass der Entwickler so tun könnte, als wüsste er nichts über die Datenbank (en). Etwas wie:

FinderObject-> getAlotOfTableAObjectsWithTableBAlreadyLoaded()

und es würde eine Abfrage auf jeder Datenbank durchführen und logisch die Ergebnisse in irgendeiner Art und Weise effizient verbinden.


Kennt jemand eine Möglichkeit, dies in Doctrine oder einem anderen PHP-ORM-Framework zu implementieren?

Antwort

0

Eine Lösung dafür ist federated tables zu verwenden, aber ich habe gelesen, dass dies keine gute Leistung hat. Alles hängt davon ab, wie Sie es verwenden müssen.

0

Ich weiß nicht von denen, die tun ... ABER vielleicht könnten Sie Propel, Memcached, and MySQL together verwenden. Richten Sie einen verteilte Speichercache mit Memcached ein, und prüfen Sie, ob Sie dort einige MySQL-Daten speichern können. Da Memcached verteilt ist, könnten beide Ihrer MySQL-Server Daten dort speichern. Dann müssten Sie einen Weg finden, um auf diesen Speicher zuzugreifen (über Memory Tables?). Scheint eine sehr knifflige Situation.

Vielleicht wird das Problem aus der falschen Richtung angegangen. Können Sie uns sagen, welches Problem Sie lösen möchten? Es könnte eine ganz andere (und einfachere!) Lösung gleich um die Ecke sein.

+0

Ihr Ansatz klingt interessant, obwohl ich noch nie Memcached verwendet, so konnte ich nicht wirklich sprich, wie machbar es wäre. Ich schreibe eine Anwendung, die Daten aus zwei Datenbanken benötigt, die auf zwei verschiedenen physischen Servern mit verschiedenen Datenbanksystemen (mysql, mssql) existieren. Ich sollte erwähnen, dass ich die Datenbanken nicht "besitze" und daher nicht verändern oder verschieben kann. Ich habe einen Ansatz in Betracht gezogen, bei dem ich die Daten im Stapel verarbeiten kann, um sie in einem dritten lokalen Datenspeicher zu speichern, in dem meine Anwendung ausgeführt werden würde. Nicht in Frage, aber es gibt Bedenken, dass die Daten veralten. –

+0

Wenn man die DBs nicht besitzt, ist es sicherlich schwierig. Sie könnten die Replikationsdateien analysieren und sie alle in Ihre eigene 3. Datenbank einfügen, die beide Datensätze enthält. Wird aber ein Wartungs-Albtraum sein, wenn sich die Schemata ändern. Viel Glück! –

1

Lehre explizit nicht unterstützt Cross-Datenbank verbindet, aber es gibt einen Weg, es zu tun:

http://www.doctrine-project.org/blog/cross-database-joins

+0

Ich habe diesen Artikel gesehen ... ziemlich coole Sachen. Leider ist es nicht ganz zutreffend. Sie beziehen sich auf Cross-Datenbank-Joins, bei denen sich mehrere Datenbanken auf demselben RDBMS befinden. In meinem Fall befinden sich die Datenbanken auf verschiedenen physischen Servern mit unterschiedlichen Datenbanksystemen (mysql, mssql). Vielen Dank für Ihre Antwort! –

Verwandte Themen