IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

Gestion des bases de données réparties


Sujet :

Symfony PHP

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Gestion des bases de données réparties
    Bonjour,
    J'ai des b ases de données réparties : une BD centrale et des BD pour chaque pays. Les paramètres de connexion aux BD de chaque pays se trouvent dans la BD centrale, donc chaque appli devra se connecter à la BD centrale pour avoir les paramètres de connection de tous les pays. Elle se connectera ainsi à ces BD et les requetera. Les tables de chaque pays sont les mêmes : même shema.
    Voilà, mes question sont les suivantes :
    1--> j'aimerai savoir si Symfony prend en compte la gestion des BD réparties.
    2-->Comment symfony (avec doctrine) generera les modéles puisque nous risquons, pour trois pays par exemple, d'avoir 3 tables identiques ?

    Merci de votre aide.

  2. #2
    Expert éminent
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Points : 8 486
    Points
    8 486
    Par défaut
    Je suppose que le nombre de pays n'est pas fixe ?

    As-tu la nécessité de modifier, afficher, les données de plus de un pays en simultané ?

    Toutes les bases de données des pays sont-elle parfaitement identique ?

    Toutes les commandes de connexion de doctrine prennent en argument un objet connexion, qui peut être définit dynamiquement, il serait donc possible de ce connecter à une base pays pour une requête à partir d'un seul ensemble d'objet du modèle.

    Mais si tu veux garder la souplesse de symfony, notamment au niveau des routes collections, il va falloir réécrire une partie des objets route, et peut-être une partie des objets symfony qui englobent les objets doctrines pour te simplifier la vie.

    Ceci va te nécessité pas mal de travail et d'étude. Mais ces modifications devraient probablement permettre l'accès à plusieurs bases pays en parallèle.

    Une requête cross base en doctrine me semble, dans le mesure de mes connaissance et sans l'avoir testé, irréalisable en version 1 de doctrine (et aussi en version 2). Donc, si tu veux faire de tel requête, c'est tous le modèles d'accès aux donnés qu'il va falloir remettre à plat. Ou, si tu n'as que les données fixes à interroger dans ce cadre (pour des statistiques par exemple), prévoir une base intermédiaire et consolidée.

    Reviens avec plus de détail, le projet est intéressant.
    Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).

    • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
    • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
    • Une discussion est terminée ? Alors le bouton est votre ami !

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 396
    Points : 396
    Points
    396
    Par défaut
    Si j'ai pas trop mal compris le problème, j'aurais tendance à dire qu'il faille uniquement manipuler le fichier databases.yml (voire ton schema.yml) ?

    Symfony / Doctrine te permet de spécifier quel objet doit se connecter à quelle base de données par l'intermédiaire de ces deux fichiers.

    Après, ta particularité est que les paramètres de connexion sont décrits dans une DB centrale. En insérant du code PHP dans tes fichiers databases.yml et schema.yml qui va requêter cette DB distante pour avoir ses données de connexion spécifiques, cela devrait pouvoir résoudre ton problème ?

  4. #4
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par mimi68 Voir le message
    Je suppose que le nombre de pays n'est pas fixe ?
    Effectivement, le nombre n'est pas fixe.

    As-tu la nécessité de modifier, afficher, les données de plus de un pays en simultané ?
    Non, les données qui seront modifiées ne concerne qu'un seul pays. Toutes les données qui nécessiterait ce cas de figure ont été mises dans la base centrale. Ce sont en general les données partagées par l'ensemble des BD Pays.

    Toutes les bases de données des pays sont-elle parfaitement identique ?
    Oui, ces bases de données ont les mêmes schéma de base. Seules les données à manipuler diffèrent.

    Toutes les commandes de connexion de doctrine prennent en argument un objet connexion, qui peut être définit dynamiquement, il serait donc possible de ce connecter à une base pays pour une requête à partir d'un seul ensemble d'objet du modèle.
    Oui mais justement, l'objet connexion à trouver dépend des paramètres que lui passera l'application. Mais certains utilisateurs ont des droits sur des pays et non pas sur un seul pays. Dès lors, les données à leur restituer doivent porter non pas sur une seule BD pays, mais sur l'ensemble des BD pays auxquelles il a accès. Ce qui revient à dire que doctrine devra requeter toutes les bases sollicitées. Mais toutes ces bases pays (puisqu'étant identiques) pourront elles partager les mêmes modèles? Si c'est le cas, doctrine prévoit il un cas de fusion de toutes les lignes retournées sur les 4 BD pays (par exemple) pour n'en retourner qu'une seule collection de l'objet du modèle? Je ne sais pas si je me suis fait comprendre.

    Mais si tu veux garder la souplesse de symfony, notamment au niveau des routes collections, il va falloir réécrire une partie des objets route, et peut-être une partie des objets symfony qui englobent les objets doctrines pour te simplifier la vie.

    Ceci va te nécessité pas mal de travail et d'étude. Mais ces modifications devraient probablement permettre l'accès à plusieurs bases pays en parallèle.
    Justement, je ne m'amuserai pas à avancer dans ce domaine : je n'ai ni le temps ni les ressources pour ce type d'aventure; non pas qu'elle ne soit pas éxitante en soit, mais disons que je suis limité

    ... Donc, si tu veux faire de tel requête, c'est tous le modèles d'accès aux donnés qu'il va falloir remettre à plat. Ou, si tu n'as que les données fixes à interroger dans ce cadre (pour des statistiques par exemple), prévoir une base intermédiaire et consolidée.
    Justement, c'est ce que je m'étais dit en premier
    Si il faut ouvrir autant de connexions aux BD pays que l'utilisateur a droit, alors je ne profiterai pas des facilités offertes par symfony.
    Et non, les données fixes sont centralisées dans la base centrale, les BD pays contiennent des données dynamiques envoyées par des agents de terrain depuis leurs terminaux mobiles. Et chaque agent de terrain envoie ces données vers la BD de son pays. Mais, les utilisateurs qui utilisent le bachend doivent avoir accès aux données recueillies afin d'avoir une meilleure vue pour leurs décisions.

    Merci du temps prie pour les réponses.

  5. #5
    Expert éminent
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Points : 8 486
    Points
    8 486
    Par défaut
    Je vois un peu plus clair, quoique.

    Encore une question, pourquoi des bases différentes par pays ? Est-ce réellement totalement et irrémédiablement indispensable ? Techniquement il serait parfaitement possible, avec peu de modification et en conservant la sécurité de mettre toutes les données dans une seule et même table. Il est évident que dans un tel cas, il n'y à plus aucun problèmes à utiliser symfony.

    Si non, il est possible de récupérer les données de connexions pour un utilisateur autorisé sur un pays et de lui donner l'accès à une pays. On peut le faire mal en créant et une connexion et en s'en servant dans les différents éléments d'un crud. Je pense que l'adaptation de l'objet sfRouteDoctrineCollection serait plus lourd, au départ, mais plus simple pour le reste des opérations et permettrait de ce servir "à peu de frais" des modules d'administration.

    Ce qui ne sera pas réalisable c'est de permettre à une personne d'accéder à une liste consolidée en backend sans passer par une consolidation physique. Quoique. On peut, peut-être, suivant la base de données utilisée créer sur la table principale, une vue consolidée des différentes tables dans les différentes bases, en Oracle on pourrait paut-être le faire ... si les bases ne dépendaient pas d'une table qui permet, à la volée, d'en changer le nombre. Il faudrait alors recréer, à chaque modification de la liste des pays, l'objet virtuel. Il est évident que ce type d'accès à des performances rédhibitoire. Je n'ai aucune idée de la possibilité de réaliser une tel manipulation sous MySql, mais je doute.

    Je reste convaincu que le plus simple est de fusionner les bases pays en une seule et unique table.


    @bilbonec, ce n'est pas réalisable pour plusieurs raisons. 1) le fichier database.yml n'est annalysé et parsé qu'une fois, avant d'être mis en cache (en mode production). 2) le PHP dans un yaml ne marche que pour le fichier fixature (à ma connaissance). 3) un modèle peut-être rattaché à une collection, il faudrait dont autant de fiches modèles qu'il n'y a de pays et de tables par pays, sans compter les difficultés de régénération du database.yml et du shéma.yml et le rebuild automatiser...
    Je crains que cela ne soit irréalisable.
    Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).

    • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
    • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
    • Une discussion est terminée ? Alors le bouton est votre ami !

  6. #6
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par mimi68 Voir le message
    Je vois un peu plus clair, quoique.

    Encore une question, pourquoi des bases différentes par pays ? Est-ce réellement totalement et irrémédiablement indispensable ?
    Oui, c'est en rapport avec la sensibilité des données mais également des reglementations differentes pour acceder aux données de leurs citoyens. Disons qu'il y a un soucis de respect des principes juridiques de chaque pays qui soutendent ce choix.

    Si non, il est possible de récupérer les données de connexions pour un utilisateur autorisé sur un pays et de lui donner l'accès à une pays. On peut le faire mal en créant et une connexion et en s'en servant dans les différents éléments d'un crud.
    Au fait, pour resumer, à chaque requête, il doit y avoir au moins deux connexion : celle de la BD centrale pour identifier le pays de l'utilisateur et donc recuperer l'adresse du serveur de BD de ce pays et une deuxième connexion vers la BD de ce pays. Il se trouve que certaines tables des BD pays sont liées avec les table de la BD centrale; voilà ce qui explique la double connexion. L'option de tout centraliser dans une seule et unique base de données est en étude; ça a été soumis au client. Mais ce qu'il faut aussi savoir, c'est que je suis en phase de choix d'un framework. Symfony m'avait semblé interessant, alors j'ai survolé un peu ce qu'il proposait mais je ne maitrise pas le plugin Doctrine et l'utilisation qu'il fait de PDO. Alors je me suis demandé si cette solution pouvait être implémentée sous symfony :
    Si nous savons que toutes les BD pays ont les mêmes tables, avec les mêmes schema, ils devraient pouvoir partager les mêmes modèles. Et si le partage des modèles est possible, et qu'on peut donner à doctrine un objet connexion, ne serait-il pas possible de récupérer dans les modèles que les données de la table à laquelle elles correspondent ? Mais je ne suis pas sur d'avoir compris au fond comment doctrine organise le mapping entre la BD et les modèles du projet symfony.
    Si dans un modèle abonne (qui correspond à la table abonne dans chaque BD pays ) serait-il possible, à partir du module abonne requeter la base d'un pays en fournissant à doctrine l'objet connexion de cette BD et réceptionner les données dans le modèle abonne ?



    Je reste convaincu que le plus simple est de fusionner les bases pays en une seule et unique table.
    Tu veux dire dans une seule Base .....
    Mais c'est l'option que j'ai proposé hier au client parce qu'un tel choix a des conséquences. Cette base ne doit pas trop être retouchée puisqu'elle est dejà en prod. Mais à coup sûr, si je pouvais les regrouper dans une seule et unique BD, je m'éviterai un travail remarquable puisque je comptais utiliser le moteur de stockage federated pour gérer certaines liaisons entre la base centrale et les bases pays. Une telle tâche implique que je compile mysql avec le moteur de stockage puisque celui ci n'étant pas intégré par defaut.
    A un moment j'ai pensé à "dupliquer" (mais pas physiquement puisqu'une table liées à une autre table distante avec FEDERATED n'est pas stockée physiquement) les tables des BD pays dans la base centrale et utiliser cette base pour symfony, mais là aussi, à chaque select sur la table "lien", un select est envoyé au serveur distant qui héberge la table "liée". Est ce que Doctrine intègre les tables "virtuelles" ? je ne suis pas sûr (je suis en phase d'étude sur la possibilité d'intégrer symfony). Ne maitrisant pas trop le process de doctrine et FEDERATED, je préférerai éviter de m'engager dans une démarche techniquement faisable mais dont je n'ai aucune vue sur les surprises potentielles.
    Donc oui, si il est possible de tout mettre dans une seule BD, ça m'arrangerait fortement. J'en serai heureux
    Mais si vous avez des pistes qui répondent à ma question en bleu je suis preneur .
    Merci !

  7. #7
    Expert éminent
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Points : 8 486
    Points
    8 486
    Par défaut
    Le projet est très intéressant intellectuellement, donc, te permettre de voir plus clair ne peux que me permettre de progresser.

    Oui, c'est en rapport avec la sensibilité des données mais également des reglementations differentes pour acceder aux données de leurs citoyens. Disons qu'il y a un soucis de respect des principes juridiques de chaque pays qui soutendent ce choix.
    J'avais bien vu cela, mais, si on considère que l'on utilise un même modèle objet pour toutes les bases en ne changeant que la connexion, où va être intégré la "réglementation diffenrente pour accéder aux données ..."

    Je pense que les problèmes de réglementation, à eux seul, mériteraient une sacré étude, notamment sur le "comment les intégrer dans un modèle objet unique" pour les données... Et, si on arrive à intégrer cette notion dans le modèle unique, la fusions des bases pays ne pose presque plus de problèmes et beaucoup de solution.

    Effectivement, il y a la possibilité d'utiliser le module FEDERATED, mais quel va être la pérennité d'une tel solution ? A noter que dans les dernières versions de MySql, il est possible de découper une (ou plusieurs) tables en fonction d'un paramètres qui pourrait ici être le pays. Mais on en reviens toujours au mêmes problèmes de performances (quoique, avec la nouvelle solution, les index sont consolidés) et une séparation des règles de gestions qu'il faudra inclure dans le moteur objet, ce qui rend caduque tout intérêt de séparation des bases.

    Doctrine est à ma connaissance un des meilleurs (si pas le meilleur) ORM disponible sous PHP (je ne maîtrise pas suffisamment celui de zend pour comparer). L'intégration avec le reste de symfony, lui donne beaucoup plus de puissance, tous en gardant la souplesse.

    Il est parfaitement possible d'envisager deux connexions, une sur la BD principale et, une fois les paramètres récupéré, une sur la base du pays, mais avec un modèle objet unique, ce qui, j'y reviens, rend caduc la notion de séparation des bases par sécurité.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Si dans un modèle abonne (qui correspond à la table abonne dans chaque BD pays ) serait-il possible, à partir du module abonne requeter la base d'un pays en fournissant à doctrine l'objet connexion de cette BD et réceptionner les données dans le modèle abonne ?
    oui

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Si nous savons que toutes les BD pays ont les mêmes tables, avec les mêmes schema, ils devraient pouvoir partager les mêmes modèles.
    Oui

    Mais je ne suis pas sur d'avoir compris au fond comment doctrine organise le mapping entre la BD et les modèles du projet symfony.
    Ceci demande quelques souffrances liées à l'apprentissage, mais reste facilement réalisable

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Est ce que Doctrine intègre les tables "virtuelles" ?
    Pas naturellement. Ceci doit être réalisable, en "trichant". Ou encore, en lui faisant prendre des vessies pour des lanternes... Ceci peut être un début de solution.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Il se trouve que certaines tables des BD pays sont liées avec les table de la BD centrale
    Ceci me fait particulièrement peur. En principe Doctrine devrait pouvoir émuler la liaison, mais au prix d'une perte de performances catastrophiques.
    Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).

    • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
    • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
    • Une discussion est terminée ? Alors le bouton est votre ami !

Discussions similaires

  1. Réponses: 0
    Dernier message: 19/11/2013, 07h57
  2. Réponses: 3
    Dernier message: 14/04/2013, 08h16
  3. [9.1] Gestion des bases de données sous Postgresql
    Par daniel1985 dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 05/03/2013, 16h29
  4. [WD14] De la mauvaise gestion des bases de données
    Par vmolines dans le forum WinDev
    Réponses: 13
    Dernier message: 05/07/2010, 10h58
  5. java et la gestion des bases de donnée access
    Par alita dans le forum JDBC
    Réponses: 1
    Dernier message: 24/03/2007, 18h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo