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

 MySQL Discussion :

Faut-il utiliser forcément des Id (INT) ou peut-on utiliser des VARCHAR dans une table associative ?


Sujet :

MySQL

  1. #1
    Candidat au Club
    Homme Profil pro
    Cyberdocumentaliste
    Inscrit en
    Janvier 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Cyberdocumentaliste
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Janvier 2014
    Messages : 3
    Points : 3
    Points
    3
    Par défaut Faut-il utiliser forcément des Id (INT) ou peut-on utiliser des VARCHAR dans une table associative ?
    Bonjour,

    Je vais poser une question sans doute bête et naïve, mais je n’ai pas trouvé de réponse claire (et je débute, merci d’être indulgent !).

    Admettons que j’aie 2 tables :
    Termes (id_terme, terme)
    Synonymes (id_syn, synonyme)

    Les champs id_terme et id_syn sont des INT.
    Les champs terme et synonyme sont des VARCHAR.

    Etant donné qu’il y a une relation n,n entre les 2 tables, je vais créer une table associative faisant correspondre les ID des 2 tables :
    Assoc(id_terme, id_syn)

    Jusque là OK.

    Et là, tout à coup, je me dis : mais après tout, qu’est-ce qui m’empêche de créer une table associative contenant les termes et les synonymes ? Ce sera peut-être moins performant (un peu, beaucoup, je ne sais pas…), mais en cas de problème, j’y verrais plus clair. Ca donnerait ça : Assoc(terme, synonyme)

    Est-ce que c’est vraiment une solution à proscrire totalement (en termes de performances) ou pas forcément ?

    Merci pour vos réponses.
    Pascal

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 847
    Points : 52 962
    Points
    52 962
    Billets dans le blog
    6
    Par défaut
    En terme de perf, oui !
    2 entiers c'est juste un calcul.
    2 chaines de caractères il faut tenir compte de la collation :
    • sensibilité à la casse ?
    • sensibilité aux accents ?
    • sensibilité au kanatypes ?
    • sensibilité au pas de casse ?
    • tri spécifique à la langue ?

    Ceci signifie que l'extra overhead engendré par des chaines de caractères est important et dans certains cas catastrophique car de nature à empêcher l'utilisation des index.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Candidat au Club
    Homme Profil pro
    Cyberdocumentaliste
    Inscrit en
    Janvier 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Cyberdocumentaliste
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Janvier 2014
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Ok merci pour ta réponse, cela confirme effectivement ce que je supposais.

    Mais en fait, ma question porte plus sur le "principe" :
    Est-ce que, à ton avis, c'est quelque chose qu'il faut absolument éviter, ou est-ce que, dans certains cas, on se peut se permettre de le faire ?
    En l'occurrence, les tables dont je parle auront quelques dizaines, voire quelques centaines d'entrées au maximum.
    Est-ce qu'il y a une limite (que l'on pourrait éventuellement déterminer par des tests, au cas par cas) en-dessous de laquelle ce serait acceptable, et au-dessus de laquelle cela aurait vraiment trop d'impact sur les performances ?
    Ou est-ce qu'il vaut mieux, PAR PRINCIPE, éviter de faire ce genre de choses ?

    Merci encore.
    Pascal

    Citation Envoyé par SQLpro Voir le message
    En terme de perf, oui !
    2 entiers c'est juste un calcul.
    2 chaines de caractères il faut tenir compte de la collation :
    • sensibilité à la casse ?
    • sensibilité aux accents ?
    • sensibilité au kanatypes ?
    • sensibilité au pas de casse ?
    • tri spécifique à la langue ?

    Ceci signifie que l'extra overhead engendré par des chaines de caractères est important et dans certains cas catastrophique car de nature à empêcher l'utilisation des index.

    A +

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 847
    Points : 52 962
    Points
    52 962
    Billets dans le blog
    6
    Par défaut
    Le nombre de ligne d'une table est une chose. La cardinalité d'une jointure en est une autre. Une table de 1000 ligne c'est pas grand chose. Mais une jointure sur 1000 lignes d'un côté et 1000 lignes de l'autre, c'est tout de suite 1000000 de lignes à brasser dans le pire des cas. Ce n'est donc pas le nombre de ligne de la table qui compte mais combien au pire de ligne peut-il y avoir dans l'ensemble des jointures de la requête !

    Autrement dit, l'utilisation de chaînes de caractères comme clef est Toujours stupide quelque soit le nombre de lignes de la table.

    A+
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Candidat au Club
    Homme Profil pro
    Cyberdocumentaliste
    Inscrit en
    Janvier 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Cyberdocumentaliste
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Janvier 2014
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    OK, merci pour ta réponse.
    Pascal

  6. #6
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 401
    Points : 19 158
    Points
    19 158
    Par défaut
    Salut pascal.

    Quand tu crées une table, tu dois toujours respecter les formes dites normales. Ceci permet d'obtenir une bonne normalisation de ton modèle et cela pose moins de problèmes.

    http://fr.wikipedia.org/wiki/Forme_n...ationnelles%29

    Citation Envoyé par pascalacsap
    Est-ce que c’est vraiment une solution à proscrire totalement (en termes de performances) ou pas forcément ?
    Pour la question de performance, tu dois te poser ces deux questions :

    1) les tables sont-elles statiques ? J'entends par là, des tables dont le contenu ne bouge jamais. Ou si tu préfères, la volumétrie ne bouge pas.

    2) est-ce que la volumétrie est faible ? De l'ordre de quelques centaines de lignes au maximum.
    Car pour la table "assoc", qui est le résultat de la cardinalité des deux autres tables, cela ne fait qu'au maximum : 100 X 100 = 10.000 lignes

    Si tu réponds oui à ces deux questions, ta solution peut-être envisagée.

    Inversement, comme tu ne maîtrises jamais ce qui va se passer dans l'avenir, je préfère que l'on respecte les formes normales. Donc préférer la première solution.

    3) une volumétrie qui peut exploser car l'usage de tes deux tables ont changé au cours du temps.

    4) de nouvelles fonctionnalités dans ton application, font que la maintenance devient lourde.
    Il se peut même que ce choix d'origine, induise de tout réécrire car totalement inadapté à ces nouvelles fonctionnalités.

    Personnellement, je préfère la première solution, même pour des tables statiques et de volumétrie faible.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Utilisation/insertion des données dans une table
    Par MomoAss dans le forum Débuter
    Réponses: 1
    Dernier message: 28/08/2012, 08h29
  2. Réponses: 5
    Dernier message: 11/03/2011, 11h59
  3. [AC-2000] gestion des erreurs lors de l'importation d'un CSV dans une table formaté
    Par zandeparis dans le forum VBA Access
    Réponses: 1
    Dernier message: 02/11/2009, 23h45
  4. Réponses: 6
    Dernier message: 12/01/2009, 10h31
  5. Ordre des champs dans une table
    Par patapetz dans le forum Outils
    Réponses: 5
    Dernier message: 30/07/2003, 06h53

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