2009-07-27 9 views
0

J'ai deux serveurs:Est-ce que les structures ORM prennent en charge les jointures inter-base de données/inter-serveur?

  • Serveur A: MySql
    • Tableau A
      • clé un
      • -clé étrangère b
  • serveur B: MsSql
    • Tableau B
      • clé b
      • foreign-key-a

On peut supposer que j'ai deux objets avec des méthodes qui gèrent les relations:

TableA-> getRelatedTableB();

TableB-> getRelatedTableA();

Ceci est facile à implémenter dans la plupart des ORM. Mais que faire si je veux obtenir un grand ensemble d'objets avec une seule requête par serveur de base de données? Idéalement, le framework devrait l'abstraire et faire la jointure logique pour que le développeur puisse prétendre qu'il ne sait rien de la ou des bases de données. Quelque chose comme:

FinderObject-> getAlotOfTableAObjectsWithTableBAlreadyLoaded()

et il effectuer une requête sur chaque base de données et rejoindre logiquement les résultats d'une certaine manière efficace. Est-ce que quelqu'un connaît un moyen de l'implémenter dans Doctrine ou dans une autre infrastructure PHP ORM?

Répondre

0

Une solution pour cela est d'utiliser federated tables, mais j'ai lu que cela n'a pas une bonne performance. Tout dépend de la façon dont vous devez l'utiliser.

0

Je ne sais pas de tout ce qui fait ... MAIS peut-être que vous pourriez utiliser Propel, Memcached, and MySQL together. Installez un cache de mémoire distribuée à l'aide de Memcached et voyez s'il existe un moyen d'y stocker des données MySQL. Parce que Memcached est distribué, vos deux serveurs MySQL pourraient y stocker des données. Ensuite, vous devrez trouver un moyen d'accéder à cette mémoire (via des tables de mémoire?). Semble une situation très délicate.

Peut-être que le problème est approché de la mauvaise direction. Pourriez-vous nous dire quel problème vous essayez de résoudre? Il pourrait y avoir une solution complètement différente (et plus simple!) Juste au coin de la rue.

+0

Votre approche semble intéressant, mais je ne l'ai jamais utilisé memcached donc je ne pouvais pas vraiment parler de la faisabilité. J'écris une application qui nécessite des données provenant de deux bases de données qui existent sur deux serveurs physiques différents utilisant des systèmes de bases de données différents (mysql, mssql). Je devrais mentionner que je ne «possède» pas les bases de données et ne peux donc pas les modifier ou les déplacer. J'ai considéré une approche où je traite les données par lots pour les agréger dans un troisième magasin de données local où mon application serait exécutée. Pas hors de question, mais cela suscite des inquiétudes quant à la pérennité des données. –

+0

Ne pas posséder les DBs le rend certainement difficile. Vous pouvez vous intéresser à l'analyse des fichiers de réplication et à leur insertion dans votre troisième base de données contenant les deux ensembles de données. Sera un cauchemar de maintenance cependant, comme les schémas changent. Bonne chance! –

1

Doctrine ne supporte pas explicitement rejoint bases de données croisées, mais il y a une façon de le faire:

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

+0

J'ai vu cet article ... des trucs sympas. Malheureusement, ce n'est pas tout à fait applicable. Ils se réfèrent à des jointures de bases de données croisées où les bases de données multiples se trouvent sur le même SGBDR. Dans mon cas, les bases de données se trouvent sur des serveurs physiques différents utilisant des systèmes de bases de données différents (mysql, mssql). Merci pour votre réponse! –

Questions connexes