Solution fonctionnelle pour modèle relationnel

Serdarus -  
blux Messages postés 27145 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour à tous,

Je souhaite créer une petite application pour la gestion d'une auto-école, mais je suis pour l'instant confronter à un problème fonctionnel...

En effet j'ai une table 'cours' qui doit prendre en compte la disponibilité des moniteurs et des véhicules avant d'être enregistré. J'ai donc pensé à mettre une clé primaire composée dans cette table mais je ne sais pas trop si ça permet de gérer tous les cas de doublons.

Une autre solution serait peut-être de mettre un champ booléen dans les tables "moniteurs" et "véhicules" pour connaître leur disponibilité mais le problème c'est que je ne sais pas comment le remettre à true si jamais je le met à false ^^'.

Voilà mon mcd : http://i.imgur.com/jlYFcnw.png?1
A voir également:

1 réponse

blux Messages postés 27145 Date d'inscription   Statut Modérateur Dernière intervention   3 362
 
Salut,

l'erreur vient de ton MCD tel qu'il est décrit.

Si un élève peut suivre plusieurs cours, un moniteur dispenser plusieurs cours et que tu peux avoir tout ce monde-là (élèves et moniteurs) sur la route en même temps (ce qui semble être le cas normal), alors tu dois avoir deux tables intermédiaires dont les clés primaires sont les concaténations des clés primaires des tables en relation.

eleve(id_eleve,...)
suit(id_eleve,id_cours,...)
cours(id_cours,...)
moniteur(id_moniteur,...)
dispense(id_moniteur,id_cours,...)
...

Tu ne devrais pas avoir de doublon, mais tu dois balayer la table moniteurs et la table véhicules pour vérifier les disponibilités avant d'insérer une nouvelle ligne dans cours (et les tables adjacentes).
0
Serdarus
 
Merci pour votre réponse,

En effet je me doutais bien qu'il fallait créer une table intermédiaire. Mais dans ce cas là je dois changer mes cardinalités et là ça m'embrouiller un peu.

Il y'aurait du 1,n de chaque côté de la table suit par exemple, non ?
0
blux Messages postés 27145 Date d'inscription   Statut Modérateur Dernière intervention   3 362
 
Absolument, une relation n-n entre deux tables se réduit à la création d'une table intermédiaire avec liaisons 1-n de chaque côté :

Table1----- 1-n -----TableInter ------ n-1 ------ Table2

La clé primaire de Tableinter est la juxtaposition des clés primaires de Table1 et Table2
0
Serdarus
 
Ok mais ça change complétement mes règles de gestion en faite. Si je rajoute la table "dispense(id_moniteur,id_cours,...) ", cela voudrait dire qu'un cours est dispensé par plusieurs moniteurs, ce que je ne veux pas. Pareil pour la table "suit", un cours doit être suivit que par un seul élève...
0
blux Messages postés 27145 Date d'inscription   Statut Modérateur Dernière intervention   3 362
 
cela voudrait dire qu'un cours est dispensé par plusieurs moniteurs, ce que je ne veux pas
Une relation n-n ne veut pas dire obligation, mais possibilité...

Ceci dit, à la lumière de la réflexion, tu as raison, pas de relation n-n avec cours, juste des 1-n.
La clé primaire de cours devrait être une concaténation de id_elève, id_moniteur, date et heure et id_véhicule, pour être sur d'interdire les doublons...
0
Serdarus
 
Donc mon MCD est bon finalement ? ^^'

J'aurais bien une table avec une table composée d'une clé primaire avec 6 champs ? :O

J'envisage tout de même de sortir l'attribut heure de la table cours et créer une table crénau_horaire où je retrouverai l'heure.

edit:

Il faut que je pose un exemple concret sinon je vais jamais y arriver...

Si j'ai les données suivantes :

Eleve : Toto
Date : 29/04/2013
Heure : 09:00:00
Moniteur : Paul
Voiture : A

Dans ma base j'aurais la clé primaire : Toto 29/04/2013 09:00:00 Paul A

Si je m'amuse à faire un nouvel enregistrement avec les mêmes données mais en changeant par exemple juste la voiture. J'aurais la clé primaire : Toto 29/04/2013 09:00:00 Paul B et ma base acceptera cette nouvelle ligne car sa clé primaire est différente de la première.
Mais fonctionnellement c'est faux, un cours utilise une et une seule voiture...

edit2:

Je suis bête, c'est ds mon code que je dois gérer ce genre d'exception derrière...

par exemple :

$sql="SELECT * FROM cours";
$result=mysql_query($sql);

while($ligne=mysql_fetch_array($result)){
if($eleve=$ligne['id_eleve'] && $date=$ligne['date'] && $ligne['heure']){
echo "Cet élève a déjà un cours à cette date !";
elseif($date=$ligne['date'] && $heure=$ligne['heure'] && $moniteur=$ligne['id_moniteur'])
echo "Ce moniteur a déjà un cours à cette date !";
etc....

Qu'en pensez vous?
0