Solution fonctionnelle pour modèle relationnel

Fermé
Serdarus - 28 avril 2013 à 17:47
blux Messages postés 26013 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 26 avril 2024 - 29 avril 2013 à 11:23
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 26013 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 26 avril 2024 3 289
28 avril 2013 à 21:33
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
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 26013 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 26 avril 2024 3 289
28 avril 2013 à 23:05
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
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 26013 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 26 avril 2024 3 289
29 avril 2013 à 10:38
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
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