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 :

Auto-incrément à partir de zéro


Sujet :

Requêtes MySQL

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    175
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Seine et Marne (Île de France)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 175
    Points : 138
    Points
    138
    Par défaut Auto-incrément à partir de zéro
    Bonjour a tous,

    j'ai plusieurs tables dans ma base pour gérer les langues (les noms sont également traduit dans toutes les langues).
    c'est pour un site sur le cinema.

    J'ai besoin d'afficher pour: film ou un dvd, etc.. une liste de langues (français, anglais, etc..., ou "aucun")
    Globalement dans le code du site l'id "1" correspond au français donc j'aimerai utiliser cet id = 1 = français dans la base de données aussi.

    "aucun" est considéré comme un language car pour les infos d'un dvd par exemple jeux avoir ces 3 cas de figures

    1: plusieurs langues renseignés
    2: "aucun" (aucun sous titres)
    3: non renseigné

    Donc voilà mon problème, pour diverses raisons j'aimerai que l'id 0 = ".." (qui correspond a "aucun")
    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
     
    CREATE TABLE IF NOT EXISTS `langues` (
      `id` tinyint(3) UNSIGNED NOT NULL AUTO_INCREMENT,
      `suffixe` char(2) NOT NULL COMMENT 'Suffixe à 2 lettres de la langue selon la norme ISO_639-1',
    PRIMARY KEY (`id`),
    UNIQUE KEY `id` (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
     
     
    INSERT INTO `langues` (`id`, `suffixe`) VALUES
    (1, 'fr'),
    (2, 'en'),
    (3, 'es'),
    (4, 'pl'),
    (5, 'de'),
    (6, '..');
    cette table (simplifiée) me permet d'obtenir un id automatiquement pour chaque langue, cet id est utilisé ensuite avec les autres tables.
    actuellement le numéro 6 correspond a ".." et j'aimerai le mettre en numéro 0.

    le problème est simplement là, et si je fais ça:
    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
     
    CREATE TABLE IF NOT EXISTS `langues` (
      `id` tinyint(3) UNSIGNED NOT NULL AUTO_INCREMENT,
      `suffixe` char(2) NOT NULL COMMENT 'Suffixe à 2 lettres de la langue selon la norme ISO_639-1',
    PRIMARY KEY (`id`),
    UNIQUE KEY `id` (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;
     
    INSERT INTO `langues` (`id`, `suffixe`) VALUES
    (0, '..'),
    (1, 'fr'),
    (2, 'en'),
    (3, 'es'),
    (4, 'pl'),
    (5, 'de');
    l'incrementation démarre quand même à 1 ce qui donne:
    (1,'..')
    et j'obtiens une erreur quand il essaie d’insérer:
    (1, 'fr')

    SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicata du champ '1' pour la clef 'PRIMARY'

    J'ai essayé avec AUTO_INCREMENT=-1 mais il n'apprécie pas non plus.

    J'ai vu que tous mes id commence a 1 dans toutes mes tables. Du coup je me demande si je ne devrais pas dans la logique SQL ajouter une colonne 'id_langue' qui elle pourrait commencer a '0'.
    Mais dans ce cas, comment obtenir automatiquement un nouvel 'id_langue' unique lorsque j'ajoute une langue ?

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 197
    Points : 12 772
    Points
    12 772
    Par défaut
    Bonjour,
    D'après l'aide en ligne de MySQL, ça devrait fonctionner si l'option NO_AUTO_VALUE_ON_ZERO est activée.
    Tu peux regarder de ce côté.

    Tatayo.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    175
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Seine et Marne (Île de France)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 175
    Points : 138
    Points
    138
    Par défaut
    Merci pour l'info,
    par contre si ça touche à la configuration de MySQL, je ne pense pas y avoir accès chez mon hébergeur donc ça va coincer.

    En fait la vrai question c'est:
    Est ce que c'est très mal d'utiliser l'id 0 sur une table ? Et pourquoi?

    Parce que sinon des solutions pour contourner le problème j'en ai vu 1 ou 2 mais j'hésite a les utiliser car si il faut tricher pour y arriver c'est qu'il doit y avoir un problème structurel au départ.

  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 760
    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 760
    Points : 52 541
    Points
    52 541
    Billets dans le blog
    5
    Par défaut
    Un ID ne devrait JAMAIS être lié à une valeur particulière (-1, 0 ou 1 par exemple). C'est pour lutter contre les clefs sémantiques que l'on a justement inventé les auto incréments !!!!

    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
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    175
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Seine et Marne (Île de France)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 175
    Points : 138
    Points
    138
    Par défaut
    J'ai eu le temps de faire des recherches et tu confirme ce que d'autres experts se tuent à dire.
    Ce qui est dommage c'est personne n'explique clairement pourquoi il ne faut pas utiliser les id pour autre chose que leur usage théorique.
    Dans quels cas un id peut changer de valeur ?

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 760
    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 760
    Points : 52 541
    Points
    52 541
    Billets dans le blog
    5
    Par défaut
    Les ID sont distribués au hasard, même s'il sont croissant tu n'as jamais aucune certitude d'avoir tel ou tel n°, du fait des accès concurrentiels.

    Un simple exemple….
    La valeur actuel du dernier auto incrément est de 10.
    Tu t'attends donc à avoir la valeur 11 pour une nouvelle insertion. Si tu es le seul utilisateur de la base de données, alors il y a toutes les chances que tu ais cette valeur pour ta prochaine insertion….
    Mais si plusieurs utilisateurs font la même insertion au même moment, alors il n'y a qu'une chance sur n que cette valeur soit celle que tu attends…. n étant le nombre d'utilisateurs qui ont lancés simultanément la même requête !
    Même chose si tu force une valeur particulière… Un autre utilisateur peut aussi forcer cette même valeur particulière !

    La plupart des développeurs oublient systématiquement les problématiques d'accès concurrentiels et se croient seul au monde quand ils pissent du code, ce qui souvent conduit à des désastres !

    Autre problématique : les auto incréments ne sont pas transactionnés pour des raisons d'efficacité et par ce que, comme ce sont des valeurs arbitraires, il n'y en a pas besoin…
    Aussi en cas de ROLLBACK lors de l'insertion, la valeur de l'auto incrément est perdu…

    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/ * * * * *

  7. #7
    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 378
    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 378
    Points : 19 054
    Points
    19 054
    Par défaut
    Salut à tous.

    Citation Envoyé par Sylvercis
    Auto-incrément à partir de zéro
    Un auto incrément sous mysql commence obligatoirement à 1.

    Citation Envoyé par Tatayo
    D'après l'aide en ligne de MySQL, ça devrait fonctionner si l'option NO_AUTO_VALUE_ON_ZERO est activée.
    Cette astuce de MySql n'est pas du tout recommandé en ce qui concerne le stockage de la valeur 0.

    Citation Envoyé par Sylvercis
    Est ce que c'est très mal d'utiliser l'id 0 sur une table ? Et pourquoi?
    Le problème est que vous utilisez cette colonne "id" comme clef primaire.
    Or cette colonne est un auto incrémenté, c'est-à-dire une colonne dont le but est d'attribuer un numéro séquentiel pour un usage technique.
    Et cet usage (clef primaire) est de rendre chaque ligne unique.

    De plus, vous attribuez un rôle particulier à l'une de ces valeurs, qui en soit est une mauvaise idée en tant que clef primaire.
    Ou si vous préférez, vous ne devez pas attribuer une signification particulère à l'une de vos valeurs.

    Citation Envoyé par Sylvercis
    j'hésite a les utiliser car si il faut tricher pour y arriver c'est qu'il doit y avoir un problème structurel au départ.
    C'est très bien, vous avez pris conscience que vous avez mal posé votre problème.

    Votre problème est le suivant :
    comment attribuer une valeur par défaut à vos DVD quand la langue est "aucune" ?

    Je comprends mieux pourquoi vous avez choisi la valeur 0.
    Dans le contexte ou vous vous trouvez, vous ne pouvez pas utiliser ce 0, il faut lui attribuer une autre valeur.
    Par exemple :
    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
    --------------
    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 `langue`
    --------------
     
    --------------
    CREATE TABLE `langue`
    ( `id`       integer unsigned not null auto_increment primary key,
      `suffixe`  char(02)         not null
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `langue` (`suffixe`) values
      ('fr'),('en'),('es'),('pl'),('de'),('..')
    --------------
     
    --------------
    select * from `langue`
    --------------
     
    +----+---------+
    | id | suffixe |
    +----+---------+
    |  1 | fr      |
    |  2 | en      |
    |  3 | es      |
    |  4 | pl      |
    |  5 | de      |
    |  6 | ..      |
    +----+---------+
    --------------
    DROP TABLE IF EXISTS `dvd`
    --------------
     
    --------------
    CREATE TABLE `dvd`
    ( `id`          integer unsigned not null auto_increment primary key,
      `fk_langue`   integer unsigned not null default 6,
      CONSTRAINT `FK_LANGUE` FOREIGN KEY (`fk_langue`) REFERENCES `langue` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `dvd` (`fk_langue`) values
      (1),(3),(4),(default),(default),(5)
    --------------
     
    --------------
    select * from `dvd` order by id
    --------------
     
    +----+-----------+
    | id | fk_langue |
    +----+-----------+
    |  1 |         1 |
    |  2 |         3 |
    |  3 |         4 |
    |  4 |         6 |
    |  5 |         6 |
    |  6 |         5 |
    +----+-----------+
    --------------
    select      t1.id,
                t2.suffixe
     
          from  `dvd` as t1
     
    inner join  `langue` as t2
            on  t2.id = t1.fk_langue
     
      order by  t1.id
    --------------
     
    +----+---------+
    | id | suffixe |
    +----+---------+
    |  1 | fr      |
    |  2 | es      |
    |  3 | pl      |
    |  4 | ..      |
    |  5 | ..      |
    |  6 | de      |
    +----+---------+
    --------------
    COMMIT
    --------------
     
    Appuyez sur une touche pour continuer...
    Cela n'a aucune important que la valeur par défaut ne soit pas zéro.
    Dans la table "dvd", s'il n'y a pas de langue, il suffit de préciser "default" lors de l'insertion.
    Et dans ce cas, il sera attribué "6", c'est-à-dire le suffixe '..', comme on peut le voir dans la requête finale.

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

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    175
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Seine et Marne (Île de France)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 175
    Points : 138
    Points
    138
    Par défaut
    D'abord, merci pour vos explications.

    @SQLpro
    Je comprends les risques possible d'erreurs que tu cite, en fait je les connaissait déjà, mais tu m'as appris qu'avec le rollback, des numéro id pouvais passer à la trappe.
    Les accès concurrentiels c'est quelque chose qui me fait peur et j'avoue que même si j'utilise les transactions dès qu'il y a un risque, j'ai toujours peur de louper quelque chose et de me retrouver un jour avec une base de données en pagaille.

    Cependant dans tes observations je ne vois pas de raison valable pour ne pas dans mon cas affecter l'id 0 à la langue "aucun".
    J’espérai une réponse où l'on me dirai que tous les id sont changés lorsqu'on defragmente la base de données ou lorsqu'on l'optimise à l'aide d'outils comme phpmyadmin. Je n'ai jamais testé et j'avoue que j'ai un peu peur du resultat.

    En général lorsque j'ajoute des données à la table, je demande ensuite a mySQL de me fournir l'id qu'il a généré lui meme pour pouvoir ensuite faire mes liaisons. A aucun moment je lui impose une id particulière.

    Effectivement le fait de décider soit même d'un numéro id durant les insertions est a bannir car risqué mais dans mon cas je ne le fait uniquement qu'à la création de la base de données car cela me permet de faire quelques raccourci ensuite dans mon code php ou javascript.
    Pour le moment le site ne sera traduit qu'en français et anglais donc je n'ai pas trop envie de systématiquement passer par la base de données lorsqu'il s'agit de gérer ces 2 languages.
    Il me faut donc une certaine cohérence entre les id que j'utilise dans le code et les id dans la base de données pour simplifier la relecture ou l'ecriture de code php/javascript.

    @Artemus24
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    insert into `langue` (`suffixe`) values
      ('fr'),('en'),('es'),('pl'),('de'),('..')
    Bien vu, je me demande aussi pourquoi j'avais indiqué des numéro id puisque le resultat est le même sans. Par contre c'est grâce à cela que j'ai eu une erreur lorsque j'ai voulu attribuer "aucun" à l'id 0.

    Mettre l'id 6 par défaut est une bonne idée mais cela ne conviendrai pas dans mon cas:
    "aucun" est considéré comme un language car pour les sous titres d'un dvd par exemple je peux avoir ces 3 cas de figures

    1: plusieurs langues renseignées
    2: "aucun" (on sait qu'il n'y a aucun sous titres dans ce dvd)
    3: non renseigné (on ne connais pas ou n'as pas encore renseigné ce champs) = NULL
    par defaut il me faudrai plutot utiliser "NULL".
    mais en fait dans la table 'DVD', j'aurai une entrée pour chaque piste de sous titre et pas juste une entrée par dvd
    je peux donc avoir:
    1: plusieurs entrée = plusieurs langues
    2: une entrée "aucun"
    3: pas d'entrée (ce qui indique qu'on n'a pas encore renseignée cette information sur le dvd)


    Si j'ai décidé récemment d'attribuer l'id 0 a "aucun" c'est parce que je voulais afficher la liste de toutes les langues sauf "aucun" dans un dialog en javascript .
    J'aurai pu simplement dans ma requete sortir toute les langues sauf la 6 ou bien écrire une requete avec des liaisons pour ne pas selectionner le nom "aucun".
    Mais c'est quand meme plus clair d'utiliser le "0" pour désigner rapidement une "non langue" afin de ne pas la selectionner ou de la supprimer d'une liste.

    Dans mon code (php, javascript) lorsque je vois "1" je sais tout de suite que c'est du français, "2" anglais. Les autres langues elles n'ont pour le moment aucun raison d'apparaitre directement dans le code donc peu importe leur id.

    Sinon d'après ton exemple, la table "langues" fini à l'identique de celle que j'utilise actuellement:
    une colonne "id" et une colonne "suffixe", donc je peux en déduire que la structure de ma table est correcte?

    Je me répète mais je ne réserve des id uniquement lors de la création de la table, ensuite à l'utilisation j'utilise l'auto-incrementation dans les règles de l'art en laissant mysql décider de la valeur.
    Donc si a aucun moment les id ne sont modifiés à mon insu (lors d'une maintenance automatisé ou autre), je ne vois toujours pas d'après vos réponses en quoi me réserver les id 0,1, et 2 peut poser problème par la suite.
    Si il n'était pas possible d'utiliser l'id "0", j'ajouterai une colonne 'id_langue' toujours en me réservant les 3 premières mais du coup la structure de la table serait plus compliqué pour rien?

    id#id_langue#suffixe
    1# 0 #..
    2# 1 #fr
    3# 2 #en
    4# 3 #es
    .....

    l'insertion deviendrai plus compliqué aussi, il faudrai que je définisse moi même 'id_langue' ?

  9. #9
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 760
    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 760
    Points : 52 541
    Points
    52 541
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par Sylvercis Voir le message
    ...
    Les accès concurrentiels c'est quelque chose qui me fait peur et j'avoue que même si j'utilise les transactions dès qu'il y a un risque, j'ai toujours peur de louper quelque chose et de me retrouver un jour avec une base de données en pagaille.
    Vous ne devez pas en avoir peur, puisque le SGBD Relationnel (MySQL l'est faiblement, mais l'est quand même...) fait systématiquement et toujours des transactions quelque soit l'opération de lecture (SELECT) ou de mise à jour (INSERT, UPDATE, DELETE) sans que vous ayez quoi que ce soit à faire ! Vous n'avez donc pas le chois et êtes comme Monsieur Jourdain, découvrant la prose...
    Cependant dans tes observations je ne vois pas de raison valable pour ne pas dans mon cas affecter l'id 0 à la langue "aucun".
    J’espérai une réponse où l'on me dirai que tous les id sont changés lorsqu'on defragmente la base de données ou lorsqu'on l'optimise à l'aide d'outils comme phpmyadmin. Je n'ai jamais testé et j'avoue que j'ai un peu peur du resultat.
    Ce que vous demandez est parfaitement faisable mais stupidement illogique. Si l'on a inventé les ID auto incrémenté, c'est justement pour ne pas avoir de clef sémantique. Soit vous utilisez une clef sémantique, par exemple un code de 8 lettres et dans ce cas, vous pouvez utiliser par exemple le code "DEFAUT" comme clef de cette valeur particulière, soit vous préférez rester en asémantique (auto-incrément) et dans ce cas il faut y rester jusqu'au bout….

    En général lorsque j'ajoute des données à la table, je demande ensuite a mySQL de me fournir l'id qu'il a généré lui meme pour pouvoir ensuite faire mes liaisons. A aucun moment je lui impose une id particulière.

    Effectivement le fait de décider soit même d'un numéro id durant les insertions est a bannir car risqué mais dans mon cas je ne le fait uniquement qu'à la création de la base de données car cela me permet de faire quelques raccourci ensuite dans mon code php ou javascript.
    C'est justement là que le problème se situe…. IL NE FAUT JAMAIS UTILISER DE RACCOURCIS et toujours se baser sur une valeur sémantique ! et non la valeur d'un ID !!!

    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/ * * * * *

  10. #10
    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 378
    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 378
    Points : 19 054
    Points
    19 054
    Par défaut
    Salut à tous.

    Citation Envoyé par Sylvercis
    Mettre l'id 6 par défaut est une bonne idée mais cela ne conviendrai pas dans mon cas:
    Je comprends votre dilemme. Mettre en 1 ne serait pas mieux car vous désirez le réserver pour "français".

    Citation Envoyé par Sylvercis
    par defaut il me faudrai plutot utiliser "NULL".
    Il est possible d'utiliser le NULL qui je le rappelle n'est pas une valeur, mais une absence de valeur.
    Sa signification sera alors "pas de langue" ou encore "aucune langue ne convient".

    Je comprends que vous ayez des contraintes, même si à mes yeux, elles ne sont pas justifiées.
    Je déconseille l'usage du zéro, que je remplacerais par celle du NULL.
    En modifiant mon exemple, voici ce que cela donne :
    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
    --------------
    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 `langue`
    --------------
     
    --------------
    CREATE TABLE `langue`
    ( `id`       integer unsigned not null auto_increment primary key,
      `suffixe`  char(02)         not null
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `langue` (`suffixe`) values
      ('fr'),('en'),('es'),('pl'),('de')
    --------------
     
    --------------
    select * from `langue`
    --------------
     
    +----+---------+
    | id | suffixe |
    +----+---------+
    |  1 | fr      |
    |  2 | en      |
    |  3 | es      |
    |  4 | pl      |
    |  5 | de      |
    +----+---------+
    --------------
    DROP TABLE IF EXISTS `dvd`
    --------------
     
    --------------
    CREATE TABLE `dvd`
    ( `id`          integer unsigned not null auto_increment primary key,
      `fk_langue`   integer unsigned     null default NULL,
      CONSTRAINT `FK_LANGUE` FOREIGN KEY (`fk_langue`) REFERENCES `langue` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `dvd` (`fk_langue`) values
      (1),(3),(4),(default),(default),(5)
    --------------
     
    --------------
    select * from `dvd` order by id
    --------------
     
    +----+-----------+
    | id | fk_langue |
    +----+-----------+
    |  1 |         1 |
    |  2 |         3 |
    |  3 |         4 |
    |  4 |      NULL |
    |  5 |      NULL |
    |  6 |         5 |
    +----+-----------+
    --------------
    select      t1.id,
                t2.suffixe
     
          from  `dvd` as t1
     
    inner join  `langue` as t2
            on  t2.id = t1.fk_langue
     
      order by  t1.id
    --------------
     
    +----+---------+
    | id | suffixe |
    +----+---------+
    |  1 | fr      |
    |  2 | es      |
    |  3 | pl      |
    |  6 | de      |
    +----+---------+
    --------------
    select           t1.id,
                     t2.suffixe
     
               from  `dvd` as t1
     
    left outer join  `langue` as t2
                 on  t2.id = t1.fk_langue
     
           order by  t1.id
    --------------
     
    +----+---------+
    | id | suffixe |
    +----+---------+
    |  1 | fr      |
    |  2 | es      |
    |  3 | pl      |
    |  4 | NULL    |
    |  5 | NULL    |
    |  6 | de      |
    +----+---------+
    --------------
    COMMIT
    --------------
     
    Appuyez sur une touche pour continuer...
    J'ai ajouté une seconde requête afin de faire apparaître le NULL quand la colonne est marquée.
    Du coup, votre dialog en javascript n'est plus nécessaire car le NULL n’apparaît pas dans la première requête.

    Citation Envoyé par Sylvercis
    je peux en déduire que la structure de ma table est correcte?
    OUI, elle est correcte.

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

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    175
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Seine et Marne (Île de France)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 175
    Points : 138
    Points
    138
    Par défaut
    @Artemus24
    Je pense que tu n'as pas bien compris mes besoins, soit parce que tu as lu un peu trop vite mes message, soit car je me suis mal exprimé.
    Le dialogue par exemple je ne peux pas m'en passer, c'est lui que je veux alimenter avec les données de la BDD.
    Mais je te remercie quand même pour tes propositions qui ont le mérite d'être détaillées.
    Pour que tu comprenne mieux comment je stocke les données pour les dvd, voilà une partie de ton exemple modifié:

    Au lieu d'une table 'dvd', j'ai une table 'dvd_audio' et une table 'dvd_st'. (je simplifie)
    Et en reprenant ton exemple,en renommant 'dvd en 'dvd_st' (sous titres du dvd) cela donnerai plutot ça:
    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
     
    --------------
    select           t1.id,
                     t2.suffixe
     
               from  `dvd_st` as t1
     
    left outer join  `langue` as t2
                 on  t2.id = t1.fk_langue
     
           order by  t1.id
    --------------
     
    +---+------------------+
    | id | id_dvd | sous_titres |
    +---+-----------------+
    |  1 | 1 | fr      |
    |  2 | 1 | en     |
    |  3 | 2 | fr      |
    |  4 | 2 | en     |
    |  5 | 3 | fr      |
    |  6 | 4 | ..      |
    |  7 | 6 | fr      |
    |  8 | 6 | en     |
    |  9 | 6 | de     |
    +---+----------+
    edit: la requête est fausse du coup mais j'ai la flemme de la corriger, le résultat est assez parlant.

    Le dvd 4 n'a "aucun" sous titres
    Les autres ont une ou plusieurs pistes de sous titres

    Pour le dvd 5, si il existe dans la base de données, il peut avoir d'autres données enregistrées dans d'autres tables mais ici il n'y a pas de données le concernant, on en déduis que sa fiche est incomplète au niveau des sous titres.
    On pourra toujours indiquer plus tard si il ne contient pas de sous titres ou quel sont les pistes de sous titres qu'il contient.

    Du coup je n'ai jamais besoin d'une ligne contenant "NULL".
    Je n'ai pas non plus besoin d'une valeur par defaut puisqu'il suffit que cette table ne contienne pas de données concernant un dvd pour savoir... euh .. qu'on ne sait pas le contenu du dvd au niveau des sous titres.

    Pour moi cette façon de stocker les données fonctionne très bien mais c'est possible qu'il y ai une meilleure façon de faire?

    Sinon, après quelques tentatives, j'ai compris que je n'arriverai pas a utiliser le zero en numéro d'id sans risques d'erreur par la suite (notamment lors de l'exportation de la base en local vers mon hébergeur).

    Et puis en écrivant ce message, je viens de me rendre compte que si je voulais tellement utiliser le numéro id "0" pour reconnaitre la langue "aucun" c'est parce que je fais du multi langue et qu'autrement que par l'id ça ne serai pas possible normalement.
    ex:
    french, français, .....
    none, aucun, ...
    etc...

    Mais en fait j'avais déjà trouvé une solution il y a longtemps pour palier à ce problème: les suffixes.
    Il suffit que je fasse une jointure lorsque je récupère les langues traduites pour récupérer les suffixes en même temps.

    je pense donc avoir résolu mon problème, même si ça ne me plais pas trop d'avoir le langage "aucun" en plein milieu des autres langues...

  12. #12
    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 378
    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 378
    Points : 19 054
    Points
    19 054
    Par défaut
    Salut Sylvercis.

    Citation Envoyé par Sylvercis
    Je pense que tu n'as pas bien compris mes besoins,
    C'est fort possible car je passe peu de temps à lire vos messages, alors que vous êtes à plein temps sur votre problème.

    Citation Envoyé par Sylvercis
    je te remercie quand même pour tes propositions qui ont le mérite d'être détaillées.
    Merci c'est sympathique de ta part.

    Citation Envoyé par Sylvercis
    edit: la requête est fausse du coup mais j'ai la flemme de la corriger, le résultat est assez parlant.
    Ce n'est pas un problème de requête mais de construction de votre modélisation.

    Vous devez créer une table associative de nom "sous-titre", avec deux clef étrangères :
    --> "fk_dvd" qui va pointer sur le descriptif du DVD.
    --> "fk_langue" qui va pointer sur la table des langues.

    Et ces deux clefs étrangères peuvent former votre clef primaire.

    Explication :

    1) quand il existe une ou plusieurs langues pour un DVD, il suffit de rentrer le couple (fk_dvd, fk_langue) dans la table associative "sous-titre".
    Comme on peut le constater, le couple (fk_dvd, fk_langue) est unique et sert donc de clef primaire pour la table association "sous-titre".

    2) s'il n'existe pas de langue pour un "DVD" donnée, il suffit tout simplement de ne pas le renseigner.
    On fait l'économie d'une ligne dans la table association "sous-titre", et l'on n'utilise pas, non plus, le marquage NULL.

    Ce qui donne :
    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
    --------------
    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 `langue`
    --------------
     
    --------------
    CREATE TABLE `langue`
    ( `id`       integer unsigned not null auto_increment primary key,
      `suffixe`  char(02)         not null
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `langue` (`suffixe`) values
      ('fr'),('en'),('es'),('pl'),('de')
    --------------
     
    --------------
    select * from `langue`
    --------------
     
    +----+---------+
    | id | suffixe |
    +----+---------+
    |  1 | fr      |
    |  2 | en      |
    |  3 | es      |
    |  4 | pl      |
    |  5 | de      |
    +----+---------+
    --------------
    DROP TABLE IF EXISTS `dvd`
    --------------
     
    --------------
    CREATE TABLE `dvd`
    ( `id`          integer unsigned not null auto_increment primary key,
      `libelle`  varchar(255)        not null
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `dvd` (`libelle`) values
      ('DVD N°1'),('DVD N°2'),('DVD N°3'),('DVD N°4'),('DVD N°5'),('DVD N°6')
    --------------
     
    --------------
    select * from `dvd`
    --------------
     
    +----+---------+
    | id | libelle |
    +----+---------+
    |  1 | DVD N°1 |
    |  2 | DVD N°2 |
    |  3 | DVD N°3 |
    |  4 | DVD N°4 |
    |  5 | DVD N°5 |
    |  6 | DVD N°6 |
    +----+---------+
    --------------
    DROP TABLE IF EXISTS `sous-titre`
    --------------
     
    --------------
    CREATE TABLE `sous-titre`
    ( `fk_dvd`      integer unsigned not null,
      `fk_langue`   integer unsigned not null,
      CONSTRAINT `FK_DVD`    FOREIGN KEY (`fk_dvd`)    REFERENCES `dvd`    (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
      CONSTRAINT `FK_LANGUE` FOREIGN KEY (`fk_langue`) REFERENCES `langue` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
      primary key (fk_dvd,fk_langue)
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `sous-titre` (`fk_dvd`,`fk_langue`) values
      (1,1),(1,2),
      (2,1),(2,2),
      (3,1),
      (6,1),(6,2),(6,5)
    --------------
     
    --------------
    select * from `sous-titre` order by fk_dvd, fk_langue
    --------------
     
    +--------+-----------+
    | fk_dvd | fk_langue |
    +--------+-----------+
    |      1 |         1 |
    |      1 |         2 |
    |      2 |         1 |
    |      2 |         2 |
    |      3 |         1 |
    |      6 |         1 |
    |      6 |         2 |
    |      6 |         5 |
    +--------+-----------+
    --------------
    select           t1.fk_dvd,
                     t2.libelle,
                     t1.fk_langue,
                     t3.suffixe
     
               from  `sous-titre` as t1
     
    left outer join  `dvd`    as t2
                  on  t2.id = t1.fk_dvd
     
    left outer join  `langue` as t3
                  on  t3.id = t1.fk_langue
     
            order by  t1.fk_dvd, t1.fk_langue
    --------------
     
    +--------+---------+-----------+---------+
    | fk_dvd | libelle | fk_langue | suffixe |
    +--------+---------+-----------+---------+
    |      1 | DVD N°1 |         1 | fr      |
    |      1 | DVD N°1 |         2 | en      |
    |      2 | DVD N°2 |         1 | fr      |
    |      2 | DVD N°2 |         2 | en      |
    |      3 | DVD N°3 |         1 | fr      |
    |      6 | DVD N°6 |         1 | fr      |
    |      6 | DVD N°6 |         2 | en      |
    |      6 | DVD N°6 |         5 | de      |
    +--------+---------+-----------+---------+
    --------------
    COMMIT
    --------------
     
    Appuyez sur une touche pour continuer...
    L'absence de lignes dans la tables association "sous-titre" peut prendre deux significations :
    --> je n'ai pas fini de remplir les informations concernant ce DVD car je ne connais pas encore toutes les langues (fiche incomplète, voir DVD N°5).
    --> pas de langue pour ce dvd (voir DVD N°4).

    Si cela a de l'importance, vous devrez gérer cette distinction entre fiche incomplète et pas de langue.

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

  13. #13
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    175
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Seine et Marne (Île de France)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 175
    Points : 138
    Points
    138
    Par défaut
    C'est exactement la structure de mes tables, j'ai aussi une table d'association 'sous_titres'.
    La grosse différence c'est que je n'ai fait aucune liaison a l'aide de clé primaire et clé etrangères comme tu l'as fais ici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     CONSTRAINT `FK_DVD`    FOREIGN KEY (`fk_dvd`)    REFERENCES `dvd`    (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
     CONSTRAINT `FK_LANGUE` FOREIGN KEY (`fk_langue`) REFERENCES `langue` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
    Je comprends le principe et l’intérêt mais ça reste encore très vague pour moi. Actuellement je suis incapable de définir ces clés moi même, bien que sur le principe ce n'est pas si compliqué.
    Il faudrait que je passe beaucoup de temps a étudier les cours sur les bases de données, m'exercer...

    J'avais d'ailleurs commencé a modéliser ma base de données sur MySQL Workbench mais ça me demandais de modifier un peu trop la structure que j'avais défini au départ si je voulais utiliser partout des liaisons à l'aide de clés.
    Cela m'aurai demandé beaucoup trop de travail en plus juste pour revoir la BDD alors qu'elle est déjà suffisamment opérationnelle selon moi et que j'ai tellement a faire dans les autres modules du site.

    Le problème c'est que pour php, javascript, css, html, etc... c'est la même chose et si je devais d'abord tout maitriser parfaitement avant de me lancer je ne ferai rien avant des années.
    Et puis je préfère apprendre en travaillant sur un projet qui m’intéresse plutôt que sur des exercices qui finissent à la poubelle.

    Donc pour le moment je vais a l'essentiel et je compense mon manque de connaissances par plus de rigueur lors de mes accès à la base de données.
    Ce n'est pas non plus la base de données de google donc c'est gérable par un humain.

    Plus tard, quand le site sera suffisamment opérationnel, je re-modéliserai tout cela progressivement à l'aide de MySQL Workbench.
    Je sais qu'au final ça me demandera encore plus de travail d'y revenir plutôt que de le faire parfaitement dés le départ mais ma priorité est déjà de rendre le site opérationnel.

  14. #14
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 130
    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 130
    Points : 38 543
    Points
    38 543
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    @Sylvercis : si la mise en oeuvre des contraintes d'intégrité peut sembler compliquée, dans les faits il n'en est rien et c'est surtout indispensable pour garantir la qualité des informations stockées dans la base de données. Une base de données dont les informations ne sont pas fiables n'a aucun intérêt. Imaginez une facture dont le montant total ne correspond pas à la somme des montants de chaque ligne.
    Ce serait une anomalie grave et passible d'amendes voir de peines de prison ! Or, dans une base de données sans contrainte d'intégrité, ce genre de situation est possible.
    En effet, dans un contexte multi-utilisateur et multi-taches seul le moteur de la base de données est en mesure de vérifier l'intégrité au travers des contraintes.
    Un traitement ne peut jamais effectuer ce travail correctement (à part dans un contexte mono utilisateur et encore).

    La bonne nouvelle c'est qu'il existe des logiciels qui permettent de modéliser les BDD. Certains sont gratuits. Ces logiciels mettent eux même en oeuvre les contraintes sans que l'utilisateur aie besoin de s'en soucier (du moins pour l'essentiel, quelques réglages restent à faire en général sur le script généré).
    Parmi les logiciels gratuits, je peux vous recommander l'excellent Looping.

  15. #15
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    175
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Seine et Marne (Île de France)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 175
    Points : 138
    Points
    138
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    Parmi les logiciels gratuits, je peux vous recommander l'excellent Looping.
    Merci pour le conseil.
    J'ai essayer de le telecharger ici: http://www.looping-mcd.fr
    mais mon anti-virus bloque le telechargement:
    La page Web figure dans la liste des sites Web comportant du contenu potentiellement dangereux.
    Il faudrait que je désactive mon anti virus pour y accéder et je ne suis pas très tenté.

  16. #16
    Membre émérite
    Avatar de Paprick
    Homme Profil pro
    Professeur des Universités
    Inscrit en
    Juin 2019
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Professeur des Universités
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2019
    Messages : 678
    Points : 2 716
    Points
    2 716
    Par défaut
    Bonjour,

    En tant qu'auteur du logiciel Looping, je peux vous garantir que vous ne risquez rien en le téléchargeant, comme l'ont déjà fait des milliers d'utilisateurs.

    Bon courage !
    Patrick Bergougnoux - Professeur des Universités au Département Informatique de l'IUT de Toulouse III
    La simplicité est la sophistication suprême (Léonard de Vinci)
    LIVRE : Modélisation Conceptuelle de Données - Une Démarche Pragmatique
    Looping - Logiciel de modélisation gratuit et libre d'utilisation

  17. #17
    Membre émérite
    Avatar de Paprick
    Homme Profil pro
    Professeur des Universités
    Inscrit en
    Juin 2019
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Professeur des Universités
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2019
    Messages : 678
    Points : 2 716
    Points
    2 716
    Par défaut
    Re-bonjour,

    Le site https://www.looping-mcd.fr vient d'être sécurisé : votre anti-virus ne devrait plus vous bloquer.
    Merci de me tenir au courant.
    Patrick Bergougnoux - Professeur des Universités au Département Informatique de l'IUT de Toulouse III
    La simplicité est la sophistication suprême (Léonard de Vinci)
    LIVRE : Modélisation Conceptuelle de Données - Une Démarche Pragmatique
    Looping - Logiciel de modélisation gratuit et libre d'utilisation

  18. #18
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 130
    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 130
    Points : 38 543
    Points
    38 543
    Billets dans le blog
    9
    Par défaut
    Merci beaucoup Paprick pour cette délicate attention (et surtout pour l'excellent Looping bien sûr :p)

  19. #19
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    175
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Seine et Marne (Île de France)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 175
    Points : 138
    Points
    138
    Par défaut
    Bonjour Paprick,

    J'ai persisté par erreur à aller sur le site en HTTP et forcement le problème était toujours là. J'ai quand même pris le logiciel en coupant l'anti-virus puis après analyse de j'ai eu la confirmation par l'anti-virus qu'il n'y avait pas de problème.
    Finalement un peu plus tard je me suis rendu compte de mon erreur et effectivement en HTTPS il n'y a plus de soucis. Forcement ce sont de nouvelles adresses du coup et donc pas (encore) blacklisté chez ESET.
    Il faudrai rajouter une redirection de toutes les adresses HTTP vers HTTPS dans le fichier .htacces pour corriger tous les liens externes.

    Sinon j'ai essayé le logiciel et il est intéressant. Il a l'air assez complet pour faire ce pour quoi il est prévu.
    Sans vouloir dénigrer votre travail que j'imagine déjà colossal pour en arriver à ce niveau, j'aurai quand même quelques remarques à faire sur des points qui m'ont gêné dés la 1ere utilisation.

    L'outil "sélection" fonctionne très bien mais il devrait être activé automatiquement selon certains cas de figures.
    Par exemple lorsque j'ajoute une entité, si je clique/double clique sur cette entité, la logique voudrai que je passe en mode sélection automatiquement plutôt qu'ajouter une entité par dessus. Si je voulais ajouter une entité, je cliquerai plutot sur une partie vide de la fenêtre. (ps: je viens découvrir l'usage du bouton droit qui corrige le problème même si ce n'est pas instinctif).

    Ensuite j'aurai préféré choisir moi même le type exacte d'une colonne plutôt que d'avoir des choix simplifiés et de laisser le programme définir le type exacte. L'idée est bonne départ pour les débutant mais il faudrait aussi un mode avancé. Bon après c'est peut être suffisant le temps de modéliser puis ensuite on peut toujours corriger le code SQL à la main.

    Enfin, et je comprends que ça serai énormement de travail pour le réaliser mais, il manque un moyen d'importer une base ou au moins une table déjà existante (ou bien je suis passé à coté).

    J'imagine que le but 1er de ce programme est pédagogique et c'est assez réussi a ce niveau.
    Peut être que couplé avec votre livre ça serai le meilleur moyen pour moi pour bien assimiler le coté relationnel des bases de données.

  20. #20
    Membre émérite
    Avatar de Paprick
    Homme Profil pro
    Professeur des Universités
    Inscrit en
    Juin 2019
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Professeur des Universités
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2019
    Messages : 678
    Points : 2 716
    Points
    2 716
    Par défaut
    Bonsoir,

    Merci pour ces remarques et votre intérêt pour Looping.
    Citation Envoyé par Sylvercis Voir le message
    J'ai persisté par erreur à aller sur le site en HTTP et forcement le problème était toujours là. J'ai quand même pris le logiciel en coupant l'anti-virus puis après analyse de j'ai eu la confirmation par l'anti-virus qu'il n'y avait pas de problème.
    Finalement un peu plus tard je me suis rendu compte de mon erreur et effectivement en HTTPS il n'y a plus de soucis.
    Effectivement, pour être sécurisé, il faut aller sur https://

    L'outil "sélection" fonctionne très bien mais il devrait être activé automatiquement selon certains cas de figures.
    Par exemple lorsque j'ajoute une entité, si je clique/double clique sur cette entité, la logique voudrai que je passe en mode sélection automatiquement plutôt qu'ajouter une entité par dessus. Si je voulais ajouter une entité, je cliquerai plutot sur une partie vide de la fenêtre. (ps: je viens découvrir l'usage du bouton droit qui corrige le problème même si ce n'est pas instinctif).
    Il est important que l'outil corresponde au dernier ordre de l'utilisateur et, comme vous venez de le découvrir, le bouton droit est là pour switcher rapidement avec le mode sélection.

    Ensuite j'aurai préféré choisir moi même le type exacte d'une colonne plutôt que d'avoir des choix simplifiés et de laisser le programme définir le type exacte. L'idée est bonne départ pour les débutant mais il faudrait aussi un mode avancé. Bon après c'est peut être suffisant le temps de modéliser puis ensuite on peut toujours corriger le code SQL à la main.
    Soyez rassuré, la version 2.4 de Looping, qui sera disponible dans le courant de la semaine, propose ce mode avancé avec une palette complète des types existants.
    Par ailleurs, le type "Libre" vous permet de définir le type exact que vous voulez.
    Enfin, la version 2.4 vous permettra de définir les types de votre propre SGBD.

    Enfin, et je comprends que ça serai énormement de travail pour le réaliser mais, il manque un moyen d'importer une base ou au moins une table déjà existante (ou bien je suis passé à coté).
    Si l'idée est d'importer une base d'un autre outil, cela parait effectivement compliqué.
    Par contre, pour récupérer des éléments ou tout un modèle provenant de Looping, un bon copier-coller fait l'affaire !

    Tant que j'y suis, puisque vous êtes sensible à l’optimisation du temps dans la réalisation des modèles, pour réaliser une association entre deux classes d'entités, il suffit de tirer un lien entre les deux entités : l'association sera créée automatiquement.

    Peut être que couplé avec votre livre ça serai le meilleur moyen pour moi pour bien assimiler le coté relationnel des bases de données.
    Comme son nom l'indique, le livre est orienté modélisation conceptuelle de données ; il explique également comment est construit le schéma relationnel de la base de données correspondant au MCD.
    Patrick Bergougnoux - Professeur des Universités au Département Informatique de l'IUT de Toulouse III
    La simplicité est la sophistication suprême (Léonard de Vinci)
    LIVRE : Modélisation Conceptuelle de Données - Une Démarche Pragmatique
    Looping - Logiciel de modélisation gratuit et libre d'utilisation

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 4 1234 DernièreDernière

Discussions similaires

  1. [AC-2003] Remise à zéro d'un champ auto-incrémenté
    Par Plume27 dans le forum Requêtes et SQL.
    Réponses: 15
    Dernier message: 01/11/2012, 19h35
  2. mise à zéro champs auto incrémentés
    Par VEUVEAMIOT dans le forum Access
    Réponses: 2
    Dernier message: 24/06/2007, 12h00
  3. Dernière clé auto incrémenté ?
    Par WOLO Laurent dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 15/11/2003, 10h41
  4. [CODE] auto incrémentation ?
    Par Roi dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 25/09/2003, 15h09
  5. ca ne fonctionne pas (generateur auto-incrémentant)
    Par tripper.dim dans le forum SQL
    Réponses: 7
    Dernier message: 26/11/2002, 00h10

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