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

Langage SQL Discussion :

Quel type pour un champ particulier ?


Sujet :

Langage SQL

  1. #1
    Membre averti

    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 464
    Points : 332
    Points
    332
    Par défaut Quel type pour un champ particulier ?
    Dans une table j'ai un champ ORDRE. Ce champ doit être UNIQUE. Il reflète un ordre entre deux enregistrements. Si je veux rentrer un nouvel enregistrement dont l'ordre est compris entre l'ordre de l'enregistrement a et l'ordre de l'enregistrement b comment faire.
    Si ORDRE est un entier il faudra modifier tous les enregistrements x vérifiant ORDRE(x) est supérieur ou égal à ORDRE(y).
    Par contre si ORDRE est un double il suffira de lui donner la valeur (ORDRE(x)+ORDRE(y)/2, encore que le nombre d'insertions possible reste quand même limitée par la précision des doubles.
    Quel est cependant la meilleure solution (même si sur le papier la deuxième solution semble préférable) ?
    C'est en respectant les autres que l'on se fait respecter.

  2. #2
    Membre actif
    Inscrit en
    Janvier 2012
    Messages
    145
    Détails du profil
    Informations forums :
    Inscription : Janvier 2012
    Messages : 145
    Points : 226
    Points
    226
    Par défaut
    Souhaitez vous faire par la suite des opérations sur ce champ "ordre" ? Selon le cas, vous pouvez décider de faire une auto-jointure sur la table, un peu comme pour une table "personne" contenant le champ "parent" (unique j'entends bien dans votre cas). Quand vous insérez un nouvel enregistrement, vous n'avez qu'un seul autre enregistrement à modifier. Pas de limite liée au format comme avec DOUBLE, pas de modification de l'ensemble des lignes qui suivent, mais le parcours de cet arbre sera moins évident...

  3. #3
    Membre averti

    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 464
    Points : 332
    Points
    332
    Par défaut
    Citation Envoyé par KookieMonster Voir le message
    Souhaitez vous faire par la suite des opérations sur ce champ "ordre" ? Selon le cas, vous pouvez décider de faire une auto-jointure sur la table, un peu comme pour une table "personne" contenant le champ "parent" (unique j'entends bien dans votre cas). Quand vous insérez un nouvel enregistrement, vous n'avez qu'un seul autre enregistrement à modifier. Pas de limite liée au format comme avec DOUBLE, pas de modification de l'ensemble des lignes qui suivent, mais le parcours de cet arbre sera moins évident...
    Merci de la réponse. Effectivement j'aurai pu penser à une structure en arbre.
    Cependant j'ai réfléchi depuis à ce problème et je me suis aperçu que ce cas arrive très peu souvent. Que les modifications de la base sont rares et donc même si l'opération de remaniement des champs ORDRE sont importants en terme de temps cela n'est pas grave.
    Donc finalement entier et remaniement.
    C'est en respectant les autres que l'on se fait respecter.

  4. #4
    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
    Au lieu de mettre 1, 2, 3 vous pouvez mettre 10, 20, 30.
    Comme ça vous conservez vos entiers et vous laissez un peu de marge.
    Si elle ne s'avère pas suffisante dans le futur il vous reste la possibilité de tout multiplier par 10.

  5. #5
    Membre averti

    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 464
    Points : 332
    Points
    332
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Au lieu de mettre 1, 2, 3 vous pouvez mettre 10, 20, 30.
    Comme ça vous conservez vos entiers et vous laissez un peu de marge.
    Si elle ne s'avère pas suffisante dans le futur il vous reste la possibilité de tout multiplier par 10.
    Effectivement c'est une bonne idée comme cela la renumérotation éventuelle sera rarissime.
    Merci.
    C'est en respectant les autres que l'on se fait respecter.

  6. #6
    Membre expérimenté
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 793
    Points : 1 327
    Points
    1 327
    Par défaut
    Bonjour,

    ne serait-il pas interessant de remplacer ordre par "suivant" (seul le dernier enregistrement aura ce champ à null)
    Si on insère un nouvel enregistrement, il suffira d'indiquer dans celui-ci l'ID de l'enregistrement qui le suit (qui était dans suivant pour l'enregistrement qui précède désormais notre nouvel enregistrement) et de mettre à jour l'enregistrement qui le précède avec l'ID de notre nouvel enregistrement.

    Celà dit si on veut ensuite faire des calculs comme compter combien d'enregistrements il y a avant, c'est beaucoup moins pratique.
    Tout depend de l'utilité qu'on en a.

    On peut aussi garder le champs ordre et faire seulement un update "Ordre = Ordre +1" pour tous les champs qui devront désormais se situer derrière.
    Le Porc est un loup pour le Porc.

  7. #7
    Membre averti

    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 464
    Points : 332
    Points
    332
    Par défaut
    Citation Envoyé par asmduty Voir le message
    Bonjour,

    ne serait-il pas interessant de remplacer ordre par "suivant" (seul le dernier enregistrement aura ce champ à null)
    Si on insère un nouvel enregistrement, il suffira d'indiquer dans celui-ci l'ID de l'enregistrement qui le suit (qui était dans suivant pour l'enregistrement qui précède désormais notre nouvel enregistrement) et de mettre à jour l'enregistrement qui le précède avec l'ID de notre nouvel enregistrement.
    Effectivement utiliser une file chaînée serait une solution

    Celà dit si on veut ensuite faire des calculs comme compter combien d'enregistrements il y a avant, c'est beaucoup moins pratique.
    Tout depend de l'utilité qu'on en a.

    On peut aussi garder le champs ordre et faire seulement un update "Ordre = Ordre +1" pour tous les champs qui devront désormais se situer derrière.
    Dans le cas qui m'intéresse : je dois récupérer un certain nombre d'enregistrement et les traiter un par un par dans l'ordre du champ ORDRE. Donc je crains que cette solution ne convienne pas.
    Peux-tu m'en dire plus sur la requête avec ORDRE=ORDRE+1
    Supposons que je veuille insérer un nouvel enregistrement dont l'ordre vaut 100.
    Avant l'insertion je commence d'abord par sélectionner tous les enregistrements tel que ORDRE>= 100.
    J'applique à chacun de ces enregistrements ORDRE = ORDRE+1 (en commençant par le dernier pour ne pas avoir de problème avec la contrainte d'unicité sur ORDRE). Ensuite j''insère le nouvel enregistrement.
    Peux-tu me détailler les lignes SQL correspondantes ?
    C'est en respectant les autres que l'on se fait respecter.

  8. #8
    Membre expérimenté
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 793
    Points : 1 327
    Points
    1 327
    Par défaut
    Je pense qu'un simple "UPDATE matable SET ordre = ordre+1 WHERE ordre >= 100" peut suffir.
    Comme on est sur une clé à vérifier si ça passe ou non par des tests, c'est pas forcément gagné.
    Et ensuite on peut faire notre insertion comme tu l'as bien dit.
    Le Porc est un loup pour le Porc.

  9. #9
    Membre averti

    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 464
    Points : 332
    Points
    332
    Par défaut
    Citation Envoyé par asmduty Voir le message
    Je pense qu'un simple "UPDATE matable SET ordre = ordre+1 WHERE ordre >= 100" peut suffir.
    Comme on est sur une clé à vérifier si ça passe ou non par des tests, c'est pas forcément gagné.
    Et ensuite on peut faire notre insertion comme tu l'as bien dit.
    Merci. je vais essayer cela.
    C'est en respectant les autres que l'on se fait respecter.

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

Discussions similaires

  1. [MySQL] Quel type pour un champ Coefficient
    Par Amaury_35 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 25/08/2009, 17h29
  2. Réponses: 2
    Dernier message: 28/01/2009, 18h33
  3. Mysql : choix des types pour les champs entre :
    Par Thierry8 dans le forum Administration
    Réponses: 3
    Dernier message: 14/06/2006, 08h22
  4. [TYPE DE CHAMPS] Quel type pour une primary key ?
    Par guy2004 dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 25/03/2006, 12h23
  5. changement de type pour un champ dans une table
    Par Missvan dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 23/02/2004, 15h26

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