Cuisine italienne

[45 min]

Un groupe de projet NF17 a réalisé un MCD pour constituer une base de données des consommations des clients d'un restaurant italien.

UML proposé pour la base de données des clients du restaurant

Informations extraites du document de synthèse fourni par les étudiants : « Une table est caractérisée par un numéro et possède toujours une capacité maximale théorique et un type. Un client, en réalité celui qui paye l'addition, possède un nom, un prénom et une date de naissance et peut avoir en plus une adresse courriel ou un numéro de téléphone (tous les deux facultatifs). Un ticket concerne un client, et chaque ticket possède un numéro unique et toujours renseigné, un nombre de couvert et le montant de l'addition réglé. Nous n'avons pas utilisé la date du ticket comme clé primaire car il est possible d'avoir la génération de deux tickets exactement au même moment. Un met est une entrée, un plat ou un dessert ; et il possède un prix.  »

« NB : Un attribut supplément dans la classe table permet de faire payer un potentiel supplément en fonction du type de table (petite terrasse, grande terrasse, etc.).  »

Question

Proposez un modèle logique de données en relationnel à partir de l'UML, en ajoutant éventuellement des clés artificielles lorsque c'est utile, et en explicitant la solution adoptée pour transformer l'héritage.

Solution

  1. Héritage exclusif

  2. Héritage complet

  3. Classe mère abstraite

On choisit l'héritage par classe mère pour des raisons de simplicité : 2 tables contre 6 à cause de l'association N:M.

1
Table(#numero, nbCouvert, type, supplement) avec nbCouvert, type NOT NULL
2
Client(#id:integer, nom, prenom, dateDeNaissance, courriel, telephone) avec (nom, prenom, dateDeNaissance) clé candidate
3
Ticket(#numero, date, nbCouvert, addition, table=>Table(numero), client=>Client(id)) avec date, nbCouvert, table, client NOT NULL
4
Met(#nom, prix, type:{'E', 'P', 'D'}) avec prix et type NOT NULL
5
Compose(#ticket=>Ticket(numero), #met=>Met(nom))
Remarque

Les types non précisés sont ceux du diagramme UML.

Question

Écrivez en algèbre relationnelle la ou les vues induites par la transformation de la relation d'héritage.

Solution

1
vEntree = RESTRICTION (Met, Type = 'E')
2
vPlat = RESTRICTION (Met, Type = 'P')
3
vDessert = RESTRICTION (Met, Type = 'D')

Question

Énoncez pour chaque relation du schéma la liste des DF sous la forme d'une fermeture transitive.

Solution

Table

  • numero -> nbCouvert, type, supplement

  • type -> supplement

Client

  • id -> nom, prenom, dateDeNaissance, courriel, telephone

  • nom, prenom, dateDeNaissance -> id, courriel, telephone

Ticket

  • numero -> date, nbCouvert, addition, table, client

Met

  • nom -> prix, type

Question

Ce MLD est-il en 3FN ? Si oui, justifiez précisément ; sinon proposez une solution pour respecter la troisième forme normale.

Solution

Le modèle n'est pas en 3NF, car un attribut non clé (supplement) est déterminé par un autre attribut non clé (type).

Il faut décomposer table en :

  • Type_Table(#type, supplement)

  • Table (#numero, nbCouvert, type=>type_table)

Question

Écrivez les instructions SQL LDD permettant de créer la base de données PostgreSQL correspondant au modèle en 3NF.

Solution

1
CREATE TABLE Type_Table(
2
type VARCHAR PRIMARY KEY,
3
supplement REAL
4
);
5
6
CREATE TABLE Table(
7
numero INTEGER PRIMARY KEY,
8
nbCouvert INTEGER NOT NULL,
9
type VARCHAR REFERENCES Type_Table(type)
10
);
11
12
CREATE TABLE Client(
13
id INTEGER PRIMARY KEY,
14
nom VARCHAR NOT NULL,
15
prenom VARCHAR NOT NULL,
16
dateDeNaissance DATETIME NOT NULL,
17
courriel VARCHAR,
18
telephone VARCHAR,
19
UNIQUE(nom, prenom, dateDeNaisance)
20
);
21
22
CREATE TABLE Ticket(
23
numero INTEGER PRIMARY KEY,
24
date DATETIME NOT NULL,
25
nbCouvert INTEGER NOT NULL,
26
addition DECIMAL,
27
table INTEGER REFERENCES Table(numero),
28
client INTEGER REFERENCES Client(id)
29
);
30
31
CREATE TABLE Met(
32
nom VARCHAR PRIMARY KEY,
33
prix REAL NOT NULL,
34
type CHAR(1) CHECK (type='E' OR type='P' OR type='D')
35
);
36
37
CREATE TABLE Compose(
38
ticket INTEGER REFERENCES Ticket(numero),
39
met VARCHAR REFERENCES Met(nom),
40
PRIMARY KEY(ticket, met)
41
);