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 :

Table vs vue matérialisée


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 181
    Par défaut Table vs vue matérialisée
    Bonjour,
    Si je dois calculer le nombre de commentaires par article et le mettre a jour automatique le plus performant c'est d'ajouter une colonne dans la table article nombre de commentaire et la mettre a jour automatiquement ou utiliser une vue matérialisé sur la table article avec ajout d'une colonne nombre article et la mettre a jour automatiquement ?

    Merci d'avance

  2. #2
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 917
    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 917
    Par défaut
    Salut dibax10.

    La bonne façon de faire est d'utiliser une view. Pourquoi ?
    Parce que vous faites un calcul qui dépend de l'état de vos tables.
    De ce fait, à la moindre modification de vos tables, vous ne serez jamais à jour.

    @+

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 181
    Par défaut
    Salut,
    D'accord mais ce qui est demandé c'est que le résultat doit etre stocker et mis à jour automatique une vue est détruite à la fin d'une session. Raison pour la quel j'ai le choix entre table et vue matérialisé

  4. #4
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 917
    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 917
    Par défaut
    Salut dibax10.

    Je mettais attardé sur la vue et non sur la "mise à jour automatique" de votre table.
    Dans ce cas, la vue est inutile. Le mieux est de créer un déclencheur sur la table "commentaire" qui va mettre à jour la table article.
    Si j'ai bien compris, votre colonne qui va comptabiliser le nombre de commentaire se trouve dans la table article.

    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
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    --------------
    START TRANSACTION
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE IF NOT EXISTS `base`
            DEFAULT CHARACTER SET `latin1`
            DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `article`
    --------------
     
    --------------
    CREATE TABLE `article`
    ( `id`                 integer unsigned  NOT NULL auto_increment primary key,
      `nombre_commentaire` integer unsigned  NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `article` (`nombre_commentaire`) values
      (0),(0),(0),(0),(0)
    --------------
     
    --------------
    select * from `article`
    --------------
     
    +----+--------------------+
    | id | nombre_commentaire |
    +----+--------------------+
    |  1 |                  0 |
    |  2 |                  0 |
    |  3 |                  0 |
    |  4 |                  0 |
    |  5 |                  0 |
    +----+--------------------+
    --------------
    DROP TABLE IF EXISTS `commentaire`
    --------------
     
    --------------
    CREATE TABLE `commentaire`
    ( `id`            integer unsigned  NOT NULL auto_increment primary key,
      `commentaire`   varchar(255)      NOT NULL,
      `clef_article`  integer unsigned  NOT NULL,
      CONSTRAINT `fk_article` FOREIGN KEY (`clef_article`) REFERENCES `article` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    DROP TRIGGER IF EXISTS `ajout_nbre`
    --------------
     
    --------------
    CREATE TRIGGER `ajout_nbre`
    AFTER INSERT ON `commentaire`
    FOR EACH ROW
    BEGIN
      DECLARE _nbre  integer default 0;
     
      set _nbre = (select count(commentaire) from `commentaire` where  clef_article = new.clef_article);
     
      update `article`
         set  nombre_commentaire = _nbre
       where  id = new.clef_article;
    END
    --------------
     
    --------------
    DROP TRIGGER IF EXISTS `suppr_nbre`
    --------------
     
    --------------
    CREATE TRIGGER `suppr_nbre`
    AFTER DELETE ON `commentaire`
    FOR EACH ROW
    BEGIN
      DECLARE _nbre  integer default 0;
     
      set _nbre = (select count(commentaire) from `commentaire` where  clef_article = old.clef_article);
     
      update `article`
         set  nombre_commentaire = _nbre
       where  id = old.clef_article;
    END
    --------------
     
    --------------
    insert into `commentaire` (`commentaire`,`clef_article`) values
      ('commentaire un',     1),('commentaire deux',     1),('commentaire trois',  2),
      ('commentaire quatre', 1),('commentaire cinq',     2),('commentaire six',    3),
      ('commentaire sept',   1),('commentaire huit',     2),('commentaire neuf',   3),
      ('commentaire dix',    4),('commentaire onze',     1),('commentaire douze',  2),
      ('commentaire treize', 3),('commentaire quatorze', 4),('commentaire quinze', 5)
    --------------
     
    --------------
    select * from `commentaire`
    --------------
     
    +----+----------------------+--------------+
    | id | commentaire          | clef_article |
    +----+----------------------+--------------+
    |  1 | commentaire un       |            1 |
    |  2 | commentaire deux     |            1 |
    |  3 | commentaire trois    |            2 |
    |  4 | commentaire quatre   |            1 |
    |  5 | commentaire cinq     |            2 |
    |  6 | commentaire six      |            3 |
    |  7 | commentaire sept     |            1 |
    |  8 | commentaire huit     |            2 |
    |  9 | commentaire neuf     |            3 |
    | 10 | commentaire dix      |            4 |
    | 11 | commentaire onze     |            1 |
    | 12 | commentaire douze    |            2 |
    | 13 | commentaire treize   |            3 |
    | 14 | commentaire quatorze |            4 |
    | 15 | commentaire quinze   |            5 |
    +----+----------------------+--------------+
    --------------
    select * from `article`
    --------------
     
    +----+--------------------+
    | id | nombre_commentaire |
    +----+--------------------+
    |  1 |                  5 |
    |  2 |                  4 |
    |  3 |                  3 |
    |  4 |                  2 |
    |  5 |                  1 |
    +----+--------------------+
    --------------
    delete from `commentaire` where id =  7
    --------------
     
    --------------
    delete from `commentaire` where id = 12
    --------------
     
    --------------
    select * from `commentaire`
    --------------
     
    +----+----------------------+--------------+
    | id | commentaire          | clef_article |
    +----+----------------------+--------------+
    |  1 | commentaire un       |            1 |
    |  2 | commentaire deux     |            1 |
    |  3 | commentaire trois    |            2 |
    |  4 | commentaire quatre   |            1 |
    |  5 | commentaire cinq     |            2 |
    |  6 | commentaire six      |            3 |
    |  8 | commentaire huit     |            2 |
    |  9 | commentaire neuf     |            3 |
    | 10 | commentaire dix      |            4 |
    | 11 | commentaire onze     |            1 |
    | 13 | commentaire treize   |            3 |
    | 14 | commentaire quatorze |            4 |
    | 15 | commentaire quinze   |            5 |
    +----+----------------------+--------------+
    --------------
    select * from `article`
    --------------
     
    +----+--------------------+
    | id | nombre_commentaire |
    +----+--------------------+
    |  1 |                  4 |
    |  2 |                  3 |
    |  3 |                  3 |
    |  4 |                  2 |
    |  5 |                  1 |
    +----+--------------------+
    --------------
    COMMIT
    --------------
     
    Appuyez sur une touche pour continuer...
    @+

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 181
    Par défaut
    Bonjour,
    nombre de commentaire n'exister pas, j'ai choisis la solution de le rajouter à la table article donc oui la je vois clairement ce qu'il faut faire
    Merci

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 636
    Billets dans le blog
    10
    Par défaut
    bonjour,

    Sauf erreur de ma part (peut être que la V8...) MySQL ne connait pas les vues matérialisées.

    Une donnée calculée, à quelques exceptions près, ne doit pas être stockée. Si vous devez connaitre le nombre de commentaires liés à un article, il faut faire un comptage à chaque fois que vous avez besoin de l'info.
    Après, le fait que la requête qui fait ce comptage soit "pré-mâchée" via une vue (non matérialisée donc puisque MySQL) libre à vous.

  7. #7
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 917
    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 917
    Par défaut
    Salut Escartefigue.

    Qu'est-ce qu'une vue matérialisée ?

    @+

  8. #8
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 636
    Billets dans le blog
    10
    Par défaut
    C'est une vue qui duplique les données (en ce sens on s'éloigne un peu de la nature "logique" de la vue) à des fins d'optimisation.
    Le rafraichissement des données par rapport à la table sous-jacente est plus ou moins synchrone.

    SQL server, DB2 ou Oracle par exemple gèrent ces vues particulières, à ma connaissance, MySQL ne les gère pas.

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

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