Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 09/02/2011, 11h07   #1
Invité régulier
 
Inscription : avril 2008
Messages : 14
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 14
Points : 6
Points : 6
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 :
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
Type de fichier : jpg phpMyAdminTablerelRef.jpg (65,1 Ko, 4 affichages)
Jiner est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2011, 13h25   #2
Invité régulier
 
Inscription : avril 2008
Messages : 14
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 14
Points : 6
Points : 6
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?
Jiner est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2011, 13h40   #3
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 990
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 10 990
Points : 18 241
Points : 18 241
Envoyer un message via MSN à CinePhil
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 !
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 09/02/2011, 14h51   #4
Invité régulier
 
Inscription : avril 2008
Messages : 14
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 14
Points : 6
Points : 6
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é.
Jiner est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2011, 15h16   #5
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 990
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 10 990
Points : 18 241
Points : 18 241
Envoyer un message via MSN à CinePhil
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.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2011, 15h59   #6
Invité régulier
 
Inscription : avril 2008
Messages : 14
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 14
Points : 6
Points : 6
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.
Jiner est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2011, 16h32   #7
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 459
Points : 10 459
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
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
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2011, 16h33   #8
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 990
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 10 990
Points : 18 241
Points : 18 241
Envoyer un message via MSN à CinePhil
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 :
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 !

Citation:
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 !
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2011, 10h08   #9
Invité régulier
 
Inscription : avril 2008
Messages : 14
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 14
Points : 6
Points : 6
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".
Jiner est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h17.


 
 
 
 
Partenaires

Hébergement Web