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 :

Script SQL d'une relation réflexive


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 15
    Points : 14
    Points
    14
    Par défaut Script SQL d'une relation réflexive
    Bonjour,


    Étant analyste développeur, je suis un peu honteux de poser cette question mais je me tourne vers vous, public avertit ayant l'habitude de sortir de pauvres développeurs comme moi d'un problème de conceptualisation.

    Alors voici mon problème. Dans le cadre d'un projet je dois mettre en place une base de données et mon problème se pose pour établir le script SQL me permettant de générer celle-ci. Jusqu'ici tout va bien mais je pèche un peu lorsque j'ai à établir une relation réflexive sur l'une de mes tables.

    Détail de la problématique : un dossier doit suivre différents traitements et passer par différents états, je veux énoncer ces états dans une table en ayant une relation qui me permette de connaitre le ou les états suivants. Donc relation réflexive. Sachant qu'un état peut être suivit de 0, un ou plusieurs états. C'est donc une relation ayant pour cardinalité (0,N).

    Utilisant DBDesigner le code généré établit deux tables, ce qui est tout à fait logique. Hors dans ma table relation je n'ai qu'un champs (Etat_idEtat) et deux clefs secondaires, hors ces deux clefs secondaires n'apparaissent pas dans ma table dans php my admin (cf copie écran).

    Voici le script généré :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    CREATE TABLE Etat (
      idEtat INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
      nomEtat VARCHAR(20) NULL,
      dateDebut DATE NULL,
      delai TIME NULL,
      PRIMARY KEY(idEtat)
    );
     
    CREATE TABLE Etat_has_Etat (
      Etat_idEtat INTEGER UNSIGNED NOT NULL,
      PRIMARY KEY(Etat_idEtat),
      INDEX Etat_has_etat_FKIndex1(Etat_idEtat),
      INDEX Etat_has_etat_FKIndex2(Etat_idEtat)
    );
    Pourriez-vous m'éclairer sur le résultat obtenu, et de quelle manière vais je pouvoir alimenter cette table ?

    Merci sincèrement de votre aide, je suis votre obligé.
    Images attachées Images attachées  

  2. #2
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 15
    Points : 14
    Points
    14
    Par défaut
    Suite à quelques investigations de ma part, je pense que le problème vient du fait que le moteurs de base de données MyIsam ne gère pas les clefs étrangères. Donc deux solutions s'offrent à moi :
    -Soit changer le moteur en InnoDB.
    -Soit gérer l'intégrité de ma table du côté application.

    L'utilisation de InnoDB est dîtes plus lente par rapport à MyIsam, en sachant que ma base va gérer un très grand nombre d'informations.

    Etes vous d'accord avec mon analyse? Et existerait-il une autre solution que je n'ai pas énoncée?

  3. #3
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Ce que je ne comprends pas, c'est pourquoi tu as une seule colonne et deux clés étrangères dans la table Etat_has_Etat.
    Une colonne n'est pas suffisante pour définir l'association entre un état et un état suivant ; il en faut deux.
    Et les deux clés étrangères sont redondantes.

    Si tu pars de ce MCD :
    Etat -0,n--(successeur)--Succéder
    |-------0,n--(prédécesseur)-----|

    Tu auras effectivement deux tables mais la table associative engendrée par l'association Succéder aura pour clé primaire le couple constitué de l'identifiant du prédécesseur et de l'identifiant du successeur.
    Etat (idEtat, nomEtat, dateDebut, delai)
    Succeder (id_predecesseur, id_successeur) <= correspond à ta table Etat_has_Etat

    Sinon effectivement, MyISAM ignore superbement les clés étrangères et il faut passer à InnoDB pour en bénéficier, ce qui est bien mieux que de vouloir gérer les contraintes d'intégrité dans l'application. Quant à la soi-disant lenteur de InnoDB par rapport à MyISAM, tu peux stocker des millions de lignes dans la table associative avant de t'en apercevoir !

  4. #4
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 15
    Points : 14
    Points
    14
    Par défaut
    Je me sens mal de ne pas avoir pensé à cela, qui parait couler de source en effet. Donc deux tables comme tu les as annoncées...
    Par contre il y a un élément que je ne saisis pas dans ta réponse "pourquoi tu as une seule colonne"; qu'entends tu par colonne? J'ai peur de ne pas saisir un aspect de ta réponse.

    Mis à part cela j'ai très bien saisi la conception à mettre en place avec d'un côté une table Etat et une table Relation_etat avec deux attributs, successeur succédé.

  5. #5
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Une table SQL est composée de colonnes et de lignes (pas de champs !) et la description de ta table ne comportait que la colonne Etat_idEtat.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 15
    Points : 14
    Points
    14
    Par défaut
    D'après ce que j'ai appris durant mes études une table est structurée en entrées et champs (lignes colonnes). Mais je ne met pas en doute tes connaissances tu as surement tes arguments pour appuyer ton affirmation.
    (Malgré mon jeune age il est important de garder un esprit critique!).

    En tous cas je te remercie pour cet éclaircissement ; je travaille seul sur un très gros projet et par moments, à force de faire chauffer la matière grise, on finit par se noyer dans un verre d'eau. Et évidemment je ne fais pas exception à la règle.

    Merci encore.

  7. #7
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    C'est une erreur courante même chez les professionnels.

    Comme une table - effectivement composée de lignes et de colonnes - est en général affichée à travers une application, sa représentation visuelle est constituée de champs et d'enregistrements.

    Donc en applicatif : tableau / champs / enregistrements
    En base de données : tables / colonnes / lignes

  8. #8
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par Jiner Voir le message
    D'après ce que j'ai appris durant mes études une table est structurée en entrées et champs (lignes colonnes). Mais je ne met pas en doute tes connaissances tu as surement tes arguments pour appuyer ton affirmation.
    (Malgré mon jeune age il est important de garder un esprit critique!).
    Ben on t'a mal appris !
    Quelle est l'instruction SQL pour ajouter une colonne à une table ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ALTER TABLE la_table
    ADD COLUMN ...
    Dans la base de métadonnées information_schema, que trouve t-on ?
    Une vue appelée COLUMNS contenant une colonne appelée COLUMN_NAME.

    Aucun FIELD dans tout ça, CQFD !

    En tous cas je te remercie pour cet éclaircissement, je travail seul sur un très gros projet et par moment à force de faire chauffer la matière grise on finit par se noyer dans un verre d'eau. Et évidemment je ne fait pas exception à la règle.
    Moi c'est pareil, sur un projet moins gros que le tien peut-être.
    Si tu connais Zend Framework et plus particulièrement actuellement les ZendX_JQuery_Autocomplete, j'ai grand besoin d'aide !

  9. #9
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 15
    Points : 14
    Points
    14
    Par défaut
    Ok je prends note pour cette leçon de vocabulaire informatique. L'informatique est une science que je qualifierais d'exacte, malgré le bagage des Docteurs en informatique qui m'ont enseigné la SGBD je remarque que les défauts de vocabulaire sont courants. Malgré tout je m'efforce "d'appeler un chat un chat", et cet enseignement est toujours bon a prendre. Pour ce qui est de Zend je n'utilise pas, ou pas encore malheureusement pour toi. Je préfère apprendre en comprenant tous les tenants et les aboutissants du code que je "pisse". Une fois maîtrisé cela, je pense me tourner vers les frameworks, mais cela n'engage que ma philosophie du génie logiciel. Sur ce, encore merci et désolé de ne pouvoir t'éclairer. Ton aide va me pousser à participer au forum en tant que "résolveur" et moins en tant que "questionneur".

Discussions similaires

  1. Export - Script SQL d'une Instance
    Par philou80 dans le forum Import/Export
    Réponses: 1
    Dernier message: 18/09/2009, 11h40
  2. Réponses: 3
    Dernier message: 25/06/2008, 15h21
  3. Exécuter un script SQL depuis une procédure PL/SQL
    Par rvfranck dans le forum PL/SQL
    Réponses: 8
    Dernier message: 19/04/2008, 01h11
  4. [SQL SERVER 2005] Relation réflexive
    Par abrial dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 22/06/2006, 11h35
  5. Appel d'un script SQL dans une procdure stockée
    Par doudou10000 dans le forum Oracle
    Réponses: 10
    Dernier message: 01/12/2004, 10h01

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