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

Oracle Discussion :

Stratégie de stockage pour gérer les traductions


Sujet :

Oracle

  1. #1
    Invité
    Invité(e)
    Par défaut Stratégie de stockage pour gérer les traductions
    Bonjour,

    Nous cherchons actuellement la meilleure stratégie (au niveau performance) à adopter pour gérer le stockage des traductions d'une application en Java. Prendre en compte les points suivants :
    - Il faudrait éviter le maximum de jointures. Une table pourrait contenir toutes les traductions mais il faudrait rajouter de nombreuses jointures coûteuses aux requêtes applicatives.
    - On doit pouvoir trier ou faire des recherches sur une traduction. Exemple : tris de la liste des clients sur le type de clients. Le type de client est une chaine internationalisable.
    - Nous avons essayé les colonnes XMLTYPE pour gérer les trads mais elles sont couteuses en performance.

    Avez-vous d'autres solutions ?

    Cordialement

  2. #2
    Membre expérimenté Avatar de ojo77
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Décembre 2010
    Messages
    680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2010
    Messages : 680
    Points : 1 597
    Points
    1 597
    Par défaut
    Citation Envoyé par Michenux Voir le message
    - Il faudrait éviter le maximum de jointures.
    Pourquoi ? Le principe du reationnel c'est d'uiliser des jointures pour éviter d'être redondant et donc être performant ...
    Citation Envoyé par Michenux Voir le message
    Une table pourrait contenir toutes les traductions mais il faudrait rajouter de nombreuses jointures coûteuses aux requêtes applicatives.
    Coûteuses en quoi ?

    Est-il possible d'avoir une description plus détaillée du problème ?

  3. #3
    Invité
    Invité(e)
    Par défaut
    Sur les applications à haute volumétrie, les jointures deviennent très coûteuses en CPU et temps de réponse. Certaines optimisations consistent à ajouter des colonnes de cache sur certaines tables pour éviter ces jointures. Aussi, plus la requête est complexe et plus Oracle aura du mal à trouver un plan d'exécution optimale. Nous cherchons actuellement à déterminer la meilleure solution à mettre en oeuvre pour gérer une internationalisation.

    Il y a plusieurs solutions possibles, on peut prendre un exemple sur une table
    T_TYPECLIENT avec une colonne label que tu veux internationaliser.

    *Solution 1:
    - Tu transformes ta colonne label en une colonne qui va contenir la clé de traduction.
    - Tu ajoutes une table de traduction (clé de trad, langue, value) avec en valeur par exemple: "champs1.label", "fr_FR", "Nom");
    - Dans tes requêtes, tu fais une jointure sur la clé de trad

    *Solution 2:
    - Tu prévois par exemple 5 colonnes dans ta table TYPECLIENT : langue_fr, langue_en, langue_ar, etc...
    - Tu évites la jointure mais ton appli aura un nombre de langues limitées.

    *Solution 3:
    - On avait pensé à une colonne TRAD de type XMLTYPE sur la table TYPECLIENT qui contient un doc genre <i18n><lng key="fr">Nom</lng><lng key="en">Name</lng></i18n>
    - Tu évites la jointure, tu gères autant de langues que tu veux mais on s'est rendu compte que les colonnes xml étaient consommatrices en CPU.

  4. #4
    Membre expérimenté Avatar de ojo77
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Décembre 2010
    Messages
    680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2010
    Messages : 680
    Points : 1 597
    Points
    1 597
    Par défaut
    Je reste convaincu que la solution 1 reste la plus efficiente avec un partitionnement par clé de traduction (en range) avec une pk (clé de traduction + langue).

    Il est possible de varier la solution 3 en utilisant des nested tables.

    Pas d'autre idée comme ça à chaud

  5. #5
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Citation Envoyé par Michenux Voir le message
    Sur les applications à haute volumétrie, les jointures deviennent très coûteuses en CPU et temps de réponse. Certaines optimisations consistent à ajouter des colonnes de cache sur certaines tables pour éviter ces jointures. Aussi, plus la requête est complexe et plus Oracle aura du mal à trouver un plan d'exécution optimale.
    ...
    N'importe quoi! Prouvez-le !
    Les bases des données existent pour faire des jointures.
    Par contre il est vrai que les applications mal écrite peuvent mettre à genou n’importe quelle version d’Oracle ou autre SGBD.

  6. #6
    Invité
    Invité(e)
    Par défaut
    J'ai pas écrit ce post pour critiquer les jointures mais pour trouver la meilleure solution pour gérer les trads par rapport à vos connaissances/expériences.
    Si pour vous, cé de le faire avec une table de traductions + jointures, alors vous m'avez répondu

  7. #7
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Je vais dans le même sens que les précédentes réponses : faites un modèle relationnel propre en suivant une méthodologie type Merise.

    Si votre base est volumineuse, une bonne combinaison des partitions et index permettront à vos requêtes de répondre extrêmement vite.
    Si votre table à la structure à trois colonnes, faites même une IOT partitionnée.

    Je reviens là-dessus :
    Certaines optimisations consistent à ajouter des colonnes de cache sur certaines tables pour éviter ces jointures.
    Ces optimisations n'en sont pas.
    Les développeurs qui "optimisent" ainsi ne s'y connaissent que très peu en SQL, et sont persuadés qu'il s'agit d'une super optimisation, alors qu'au final ce n'est qu'un écran de fumée : on fait faire par un serveur applicatif ce qu'un SGBD fait le mieux : en effet vos jointures seront forcément quelque part dans votre code applicatif, avec des jolies boucles qui s'imbriquent.
    Et il reste le problème du refresh du cache.
    Et si votre cache dépasse la taille de la RAM du serveur applicatif ça ne va rien optimiser du tout.
    Et sûrement bien d'autres problèmes dont les développeurs d'optimisations ne vous parleront qu'après la mise en production.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Quand je parlais colonne de cache, ce n'est pas au niveau applicatif mais toujours au niveau de la BD. C'est par exemple pour accéder à une colonne col1 sur une table D à partir d'une table A et que je dois passer par les tables B et C pour y accéder (via jointures).
    Et bien pour éviter çà, on peut faire un modèle un peu moins relationel en dupliquant la donnée col1 dans la table A. Comme çà, pas de jointure à faire mais par contre, on pénalise les mises à jour (2 cols à mettre à jour).

    Sinon, j'aime bien l'idée des tables IOT. A tester.

  9. #9
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Citation Envoyé par Michenux Voir le message
    ...
    Sinon, j'aime bien l'idée des tables IOT. A tester.
    Pourquoi ?

  10. #10
    Invité
    Invité(e)
    Par défaut
    Moins d'IO

Discussions similaires

  1. Quels modules Perl pour gérer les documents XML ?
    Par djibril dans le forum Modules
    Réponses: 8
    Dernier message: 02/12/2010, 23h54
  2. [Info] Conseils pour gérer les ressources
    Par calogerogigante dans le forum Eclipse Java
    Réponses: 10
    Dernier message: 05/07/2009, 12h49
  3. Réponses: 13
    Dernier message: 07/02/2007, 12h10
  4. Méthode simple pour gérer les collisions
    Par Hyoga dans le forum OpenGL
    Réponses: 2
    Dernier message: 19/02/2005, 13h43

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