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

Requêtes MySQL Discussion :

Idée d'amélioration d'algorithmie


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2008
    Messages : 33
    Par défaut Idée d'amélioration d'algorithmie
    Bonjour, j'aimerais des petits conseils quant à un problème que j'ai sur le développement d'un projet.

    Voilà j'effectue une sauvegarde dans une base de donnée d'un très grand nombre de données.

    Du style j'administre des droits pour des films.
    Un film à 100 pays où je peux mettre des droits : exclusif ou non-exclusif.
    Et pour chaque pays, j'ai également 26 lignes.

    Ce qui me fait un total de 25*2*100 = 5600 cases à enregistrer.

    La "technique" que j'utilise et qu'à chaque fois que je fais des modifs sur un film, je delete (sauvagement) toutes les infos de ce film dans ma base, puis je ré-enregistre les nouvelles données. Je faisais des uptade précedemment mais bon dans un "soucis" de ne pas avoir 2 fois une même infos j'ai préféré tout delete.

    Voici la tête de ma table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    --
    -- Structure de la table `droits_pays_attributs`
    --
     
    CREATE TABLE IF NOT EXISTS `droits_pays_attributs` (
      `id` int(11) NOT NULL auto_increment,
      `case0_0` enum('oui','non') default NULL,
      `case0_1` enum('oui','non') default NULL,
      `case1_0` enum('oui','non') default NULL,
      `case1_1` enum('oui','non') default NULL,
      `case2_0` enum('oui','non') default NULL,
      `case2_1` enum('oui','non') default NULL,
      `case3_0` enum('oui','non') default NULL,
      `case3_1` enum('oui','non') default NULL,
      `case4_0` enum('oui','non') default NULL,
      `case4_1` enum('oui','non') default NULL,
      `case5_0` enum('oui','non') default NULL,
      `case5_1` enum('oui','non') default NULL,
      `case6_0` enum('oui','non') default NULL,
      `case6_1` enum('oui','non') default NULL,
      `case7_0` enum('oui','non') default NULL,
      `case7_1` enum('oui','non') default NULL,
      `case8_0` enum('oui','non') default NULL,
      `case8_1` enum('oui','non') default NULL,
      `case9_0` enum('oui','non') default NULL,
      `case9_1` enum('oui','non') default NULL,
      `case10_0` enum('oui','non') default NULL,
      `case10_1` enum('oui','non') default NULL,
      `case11_0` enum('oui','non') default NULL,
      `case11_1` enum('oui','non') default NULL,
      `case12_0` enum('oui','non') default NULL,
      `case12_1` enum('oui','non') default NULL,
      `case13_0` enum('oui','non') default NULL,
      `case13_1` enum('oui','non') default NULL,
      `case14_0` enum('oui','non') default NULL,
      `case14_1` enum('oui','non') default NULL,
      `case15_0` enum('oui','non') default NULL,
      `case15_1` enum('oui','non') default NULL,
      `case16_0` enum('oui','non') default NULL,
      `case16_1` enum('oui','non') default NULL,
      `case17_0` enum('oui','non') default NULL,
      `case17_1` enum('oui','non') default NULL,
      `case18_0` enum('oui','non') default NULL,
      `case18_1` enum('oui','non') default NULL,
      `case19_0` enum('oui','non') default NULL,
      `case19_1` enum('oui','non') default NULL,
      `case20_0` enum('oui','non') default NULL,
      `case20_1` enum('oui','non') default NULL,
      `case21_0` enum('oui','non') default NULL,
      `case21_1` enum('oui','non') default NULL,
      `case22_0` enum('oui','non') default NULL,
      `case22_1` enum('oui','non') default NULL,
      `case23_0` enum('oui','non') default NULL,
      `case23_1` enum('oui','non') default NULL,
      `case24_0` enum('oui','non') default NULL,
      `case24_1` enum('oui','non') default NULL,
      `id_pays` int(11) default NULL,
      `id_film` int(11) default NULL,
      PRIMARY KEY  (`id`),
      KEY `id_film` (`id_film`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    	$id_film=$_REQUEST['id'];
     
    	include($connexion);
    	mysql_query("DELETE FROM `droits_pays_attributs` WHERE `id_film`='$id_film'") or die(mysql_error());
    	$exec_requete_select=mysql_query("SELECT * FROM droits_groupe order by nom_groupe ASC") or die(mysql_error());
     
    	while($ligne_groupe = mysql_fetch_array($exec_requete_select)){
     
    		$id_base=$ligne_groupe['id'];
     
    		$exec_requete_select2=mysql_query("SELECT * FROM droits_pays where id_groupe='$id_base' order by nom_pays ASC") or die(mysql_error());					
    		$id_pays_base=array(); $case=array();
    		while($ligne_pays=mysql_fetch_array($exec_requete_select2)){
    			$id_pays_base[]=$ligne_pays['id'];
    		}
     
    		$requete_count = mysql_query("SELECT COUNT( * ) NBR_ENTREE FROM droits_pays where id_groupe='$id_base'") or die(mysql_error());
    		$row_count = mysql_fetch_object($requete_count); 
     
    		for($h=0;$h<$row_count->NBR_ENTREE;$h++){
    			for($k=0;$k<25;$k++){
    				for($w=0;$w<2;$w++){
    					if($_REQUEST["case_".$id_pays_base[$h]."_".$k."_".$w]=='oui'){
    						$case[$k][$w] ='oui';
    					}
    					else{
    						$case[$k][$w] ='non';
    					}
    				}
    			}
    		}
     
    		for($h=0;$h<$row_count->NBR_ENTREE;$h++){
    			$emplacement_0 = array();$emplacement_1 = array();$valeur_0 = array();$valeur_1 = array();
    			for($k=0;$k<25;$k++){			
    				$emplacement_0[$k] = "case".$k."_0";
    				$emplacement_1[$k] = "case".$k."_1";
    				$valeur_0[$k] = $case[$k][0];
    				$valeur_1[$k] = $case[$k][1];
    			}
    			$sql = "INSERT `droits_pays_attributs` SET `id_pays`='$id_pays_base[$h]', `id_film`='$id_film', ".
    			"`$emplacement_0[0]`='$valeur_0[0]', `$emplacement_1[0]`='$valeur_1[0]', ".
    			"`$emplacement_0[1]`='$valeur_0[1]', `$emplacement_1[1]`='$valeur_1[1]', ".
    			"`$emplacement_0[2]`='$valeur_0[2]', `$emplacement_1[2]`='$valeur_1[2]', ".
    			"`$emplacement_0[3]`='$valeur_0[3]', `$emplacement_1[3]`='$valeur_1[3]', ".
    			"`$emplacement_0[4]`='$valeur_0[4]', `$emplacement_1[4]`='$valeur_1[4]', ".
    			"`$emplacement_0[5]`='$valeur_0[5]', `$emplacement_1[5]`='$valeur_1[5]', ".
    			"`$emplacement_0[6]`='$valeur_0[6]', `$emplacement_1[6]`='$valeur_1[6]', ".
    			"`$emplacement_0[7]`='$valeur_0[7]', `$emplacement_1[7]`='$valeur_1[7]', ".
    			"`$emplacement_0[8]`='$valeur_0[8]', `$emplacement_1[8]`='$valeur_1[8]', ".
    			"`$emplacement_0[9]`='$valeur_0[9]', `$emplacement_1[9]`='$valeur_1[9]', ".
    			"`$emplacement_0[10]`='$valeur_0[10]', `$emplacement_1[10]`='$valeur_1[10]', ".
    			"`$emplacement_0[11]`='$valeur_0[11]', `$emplacement_1[11]`='$valeur_1[11]', ".
    			"`$emplacement_0[12]`='$valeur_0[12]', `$emplacement_1[12]`='$valeur_1[12]', ".
    			"`$emplacement_0[13]`='$valeur_0[13]', `$emplacement_1[13]`='$valeur_1[13]', ".
    			"`$emplacement_0[14]`='$valeur_0[14]', `$emplacement_1[14]`='$valeur_1[14]', ".
    			"`$emplacement_0[15]`='$valeur_0[15]', `$emplacement_1[15]`='$valeur_1[15]', ".
    			"`$emplacement_0[16]`='$valeur_0[16]', `$emplacement_1[16]`='$valeur_1[16]', ".
    			"`$emplacement_0[17]`='$valeur_0[17]', `$emplacement_1[17]`='$valeur_1[17]', ".
    			"`$emplacement_0[18]`='$valeur_0[18]', `$emplacement_1[18]`='$valeur_1[18]', ".
    			"`$emplacement_0[19]`='$valeur_0[19]', `$emplacement_1[19]`='$valeur_1[19]', ".
    			"`$emplacement_0[20]`='$valeur_0[20]', `$emplacement_1[20]`='$valeur_1[20]', ".
    			"`$emplacement_0[21]`='$valeur_0[21]', `$emplacement_1[21]`='$valeur_1[21]', ".
    			"`$emplacement_0[22]`='$valeur_0[22]', `$emplacement_1[22]`='$valeur_1[22]', ".
    			"`$emplacement_0[23]`='$valeur_0[23]', `$emplacement_1[23]`='$valeur_1[23]', ".
    			"`$emplacement_0[24]`='$valeur_0[24]', `$emplacement_1[24]`='$valeur_1[24]'";
     
    			mysql_query($sql) or die(mysql_error());;									
    		}
     
    	}
    	include($deconnexion);
    J'aimerais savoir si par expérience, quelqu'un n'aurait pas une "technique" ou idée qui serait plus judicieuse quant au niveau en temps d'execution.

    Voilà, je vous remercie par avance.

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par Kalmos2 Voir le message
    Du style j'administre des droits pour des films.
    Un film à 100 pays où je peux mettre des droits : exclusif ou non-exclusif.
    Donc si je comprends bien, on a la relation :
    Film -0,n----Accorder droits----0,n- Pays

    Et pour chaque pays, j'ai également 26 lignes.
    Là je ne comprends pas ce que sont ces 26 lignes !

    La "technique" que j'utilise et qu'à chaque fois que je fais des modifs sur un film, je delete (sauvagement) toutes les infos de ce film dans ma base, puis je ré-enregistre les nouvelles données. Je faisais des uptade précedemment mais bon dans un "soucis" de ne pas avoir 2 fois une même infos j'ai préféré tout delete.
    Si tu fais des UPDATE, tu ne change que les infos nécessaires pour le film en question, je ne vois pas pourquoi tu aurais deux fois les infos ?
    Par contre, supprimer un film pour le réenregistrer, ce n'est pas comme ça qu'on travaille avec une base de données. Les films ne sont-ils pas en relations avec d'autres tables, comme le suggère mon schéma ci-dessus ? Alors en supprimant le film, tu supprimes en cascade les enregistrements associés dans les autres tables ou alors tes données deviennent mortes et inutilisables !

    Voici la tête de ma table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    --
    -- Structure de la table `droits_pays_attributs`
    --
     
    CREATE TABLE IF NOT EXISTS `droits_pays_attributs` (
      `id` int(11) NOT NULL auto_increment,
      `case0_0` enum('oui','non') default NULL,
      `case0_1` enum('oui','non') default NULL,
      `case1_0` enum('oui','non') default NULL,
      `case1_1` enum('oui','non') default NULL,
      `case2_0` enum('oui','non') default NULL,
      `case2_1` enum('oui','non') default NULL,
      `case3_0` enum('oui','non') default NULL,
      `case3_1` enum('oui','non') default NULL,
      `case4_0` enum('oui','non') default NULL,
      `case4_1` enum('oui','non') default NULL,
      `case5_0` enum('oui','non') default NULL,
      `case5_1` enum('oui','non') default NULL,
      `case6_0` enum('oui','non') default NULL,
      `case6_1` enum('oui','non') default NULL,
      `case7_0` enum('oui','non') default NULL,
      `case7_1` enum('oui','non') default NULL,
      `case8_0` enum('oui','non') default NULL,
      `case8_1` enum('oui','non') default NULL,
      `case9_0` enum('oui','non') default NULL,
      `case9_1` enum('oui','non') default NULL,
      `case10_0` enum('oui','non') default NULL,
      `case10_1` enum('oui','non') default NULL,
      `case11_0` enum('oui','non') default NULL,
      `case11_1` enum('oui','non') default NULL,
      `case12_0` enum('oui','non') default NULL,
      `case12_1` enum('oui','non') default NULL,
      `case13_0` enum('oui','non') default NULL,
      `case13_1` enum('oui','non') default NULL,
      `case14_0` enum('oui','non') default NULL,
      `case14_1` enum('oui','non') default NULL,
      `case15_0` enum('oui','non') default NULL,
      `case15_1` enum('oui','non') default NULL,
      `case16_0` enum('oui','non') default NULL,
      `case16_1` enum('oui','non') default NULL,
      `case17_0` enum('oui','non') default NULL,
      `case17_1` enum('oui','non') default NULL,
      `case18_0` enum('oui','non') default NULL,
      `case18_1` enum('oui','non') default NULL,
      `case19_0` enum('oui','non') default NULL,
      `case19_1` enum('oui','non') default NULL,
      `case20_0` enum('oui','non') default NULL,
      `case20_1` enum('oui','non') default NULL,
      `case21_0` enum('oui','non') default NULL,
      `case21_1` enum('oui','non') default NULL,
      `case22_0` enum('oui','non') default NULL,
      `case22_1` enum('oui','non') default NULL,
      `case23_0` enum('oui','non') default NULL,
      `case23_1` enum('oui','non') default NULL,
      `case24_0` enum('oui','non') default NULL,
      `case24_1` enum('oui','non') default NULL,
      `id_pays` int(11) default NULL,
      `id_film` int(11) default NULL,
      PRIMARY KEY  (`id`),
      KEY `id_film` (`id_film`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    C'est semble t-il la table associative entre les films et les pays qui serait issue de mon schéma. Alors elle ne devrait pas avoir d'identifiant propre, sa clé primaire devrait être le couple (id_film, id_pays).
    Et c'est quoi toutes ces colonnes booléennes caseXXX ?

    J'aimerais savoir si par expérience, quelqu'un n'aurait pas une "technique" ou idée qui serait plus judicieuse quant au niveau en temps d'execution.
    Ben si tu changes les renseignements d'un film, ça se passe dans la table des films donc une seule ligne à modifier, à moins que tu en aies 100 000 sur un serveur sous-dimensionné, ça ne doit prendre qu'une fraction de seconde.

    Si tu ajoutes des droits pour un pays à un film, je supposes que tu fais ça avec une application utilisatrice où les colonnes caseXXX correspondent à des cases à cocher. C'est donc le programme qui construit la requête pour toi et il n'y a qu'une ligne de la table associative à changer. Ca ne devrait pas non plus prendre plus d'une fraction de seconde.

    Si tu modifies les droits d'un film pour un pays, tu n'as là aussi qu'une ligne de la table associative à changer ; c'est toujours aussi court.

    Si tu modifies les droits d'un film pour tous les pays, et si tu as au maximum 100 pays, tu auras donc au maximum 100 lignes à modifier de manière automatisée par le programme. Allez, ça va prendre 1/2 seconde ?

    Donc je ne vois pas le problème. Qu'est-ce qui coince ?

    PS : c'est dans quelle société de films ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2008
    Messages : 33
    Par défaut
    Comme je le pensais, je ne m'exprime jamais clairement

    Merci de ta réponse en tout cas.

    Pour la question de la clé de ma table, la variable id ne sert à rien effectivement.

    En fait le soucis, c'est que mes nombres de pays peuvent varier. Ainsi que le nombre de films bien entendu, c'est pourquoi chacune de mes lignes gardent l'id du film, ainsi que celui du pays en question.

    --------------

    Si tu ajoutes des droits pour un pays à un film, je supposes que tu fais ça avec une application utilisatrice où les colonnes caseXXX correspondent à des cases à cocher. C'est donc le programme qui construit la requête pour toi et il n'y a qu'une ligne de la table associative à changer. Ca ne devrait pas non plus prendre plus d'une fraction de seconde.
    En effet, j'ai une page web qui me fabrique automatiquement toutes mes cases à cocher qui correspondent à mes caseX_X dans ma table.

    -----------

    Et c'est quoi toutes ces colonnes booléennes caseXXX ?
    Savoir si ma case est cochée ou non ? (nul comme idée ? ^^)

    --------

    Si tu fais des UPDATE, tu ne change que les infos nécessaires pour le film en question, je ne vois pas pourquoi tu aurais deux fois les infos ?
    Oui évidemment, c'est juste que j'avais codé ça à la va-vite à un moment et pour être sur de pas bugué à certains endroits j'avais préféré tout delete pour être sur.

    ----------

    Quand je parlais d'effacer les infos du film, je parlais bien sur que dans ma table en question.

    d'où le :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mysql_query("DELETE FROM `droits_pays_attributs` WHERE `id_film`='$id_film'") OR die(mysql_error());
    --------------------

    Là je ne comprends pas ce que sont ces 26 lignes !
    25 lignes en fait, et ça correspond à d'autres droits qui apparaissent ou non sur ma page au départ.

    -------------------

    Si tu modifies les droits d'un film pour tous les pays, et si tu as au maximum 100 pays, tu auras donc au maximum 100 lignes à modifier de manière automatisée par le programme. Allez, ça va prendre 1/2 seconde ?

    Donc je ne vois pas le problème. Qu'est-ce qui coince ?
    Après quant au temps c'est sur que ca ne prend que 5 secondes pour que mes modifs soient effectué mais je trouvais ca trop long et ma méthode un peu trop bourrin, c'est pour ca que je voulais des conseils.

Discussions similaires

  1. Des idées, des améliorations ?
    Par imikado dans le forum MkFramework
    Réponses: 4
    Dernier message: 24/04/2013, 09h54
  2. Idée pour amélioration de code
    Par Xenon03 dans le forum Langage
    Réponses: 4
    Dernier message: 21/10/2012, 09h34
  3. [Débutant] idée pour améliorer mon code ?
    Par Imène_23 dans le forum MATLAB
    Réponses: 7
    Dernier message: 28/08/2011, 00h54
  4. [recherche] idée d'amélioration
    Par franculo_caoulene dans le forum Evolutions du club
    Réponses: 8
    Dernier message: 08/12/2007, 13h33

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