Bonjour, je viens vers vers vous afin de répondre a une question simple :
Une clé primaire doit-elle toujours être composée de clé étrangère ? Si oui, pourquoi ?
Afin de préciser cette question, je vais l'illustrer avec le détail d'un projet sur lequel je travaille pour mon école.
Ce projet concerne la création d'une application de réservation de place de cinéma.
Il est question pour un utilisateur de pouvoir réserver une place de cinéma pour une certaine séance, qui sera déterminée pour un film donné, dans une salle à une certaine date et un certain horaire.
Ces séance auront été programmées à l'avance par un gérant de cinéma.
Afin de stocker les différentes informations (film, séance, réservation) je dois utiliser une base de donnée MySQL.
J'utilise le formalisme UML afin représenter mes objets dans l'application
.
À partir de mon schéma UML j'en déduis mon schéma de base de données.
Le souci que j'ai actuellement est celui de la représentation d'une séance en base de données.
Actuellement une séance est identifiée de manière unique par la salle dans laquelle elle a lieu, sa date, ainsi que son horaire de début (son horaire de fin étant calculé à partir de la durée du film)
Les horaires sont en fait des tranches de 30 minutes numérotées de 1 à 48, cela permet la création d'un planning simplifié pour le gérant qui choisit sur quels chéneaux il place ses films.
Ces trois informations constituent donc la clé primaire composée de la relation Séance.
Ainsi un tuple Séance peut être représenté de la manière suivante :
Séance ( idSalle, date, horaireDebut, horaireFin, film)
Deux séances peuvent donc se dérouler à la même date pour une même salle mais pas au même horaire)
Si mes souvenirs sont bons, il me semble qu'une clé primaire ne peut être composée que de clé étrangère.
Ce qui signifie qu'il me faut créé une relation Date contenant les différentes date des séances, chacune d'elle identifiées de manière unique (à l'aide d'un idDate).
De même qu'une relation Horaire dans laquelle je listerai tous mes horaires que j'identifierai également de manière unique (à l'aide d'un idHoraire).
Et c'est là que le bât blesse.
En effet mes l'attribut horaireDebut qui compose la clé primaire de la relation Séance n'a que 48 valeurs possibles, je trouve dommage de créer une relation uniquement pour cela.
De même pour les dates même si leur nombres peut être très grand dois-je forcement passer par la création d'une relation Date ?
Ne puis-je pas plutôt composer la clé primaire de la relation Séance à partir de l'id d'une salle, d'une date et d'un horaire sans que ces deux derniers soit eux-mêmes des clés étrangères.
Lors de l'ajout d'une séance j'irais alors vérifier à l'aide d'une contrainte d'intégrité qu'aucune séance pour cette salle n'est la même date ET le même horaire de début. (J’occulte ici les vérifications à effectuer concernant le chevauchement des séances)
Qu'en pensez-vous ?
Partager