Commit 5b81ecf0 authored by Barnabe Sellier's avatar Barnabe Sellier
Browse files

Merge branch 'main' of https://gitlab.utc.fr/obordeau/nf18_projet1 into main

parents e43e5c0b 9a255518
# __MLD__ <br/>
---Modèle logique de données---
Artiste (#IDA: integer, nom: varchar, prenom: varchar, naiss: date, mort: date)
<br/>
Oeuvre_ext(#IDO: integer, titre: varchar, dimensions: varchar, type: Type_oeuvre, date_crea: integer, auteur=>Artiste, expo=>Expo_temp)
<br/>
Oeuvre_louvre(#IDO: integer, titre: varchar, dimensions: varchar, type: Type_oeuvre, date_crea: integer, auteur=>Artiste, prix_acq: integer, date_acq : date, expo=>Expo_perm)
<br/>
Prete(#IDO=>Oeuvre_ext, #musee=>Musee_ext, debut: date, fin: date)
<br/>
Emprunte(#IDO=>Oeuvre_louvre, #musee=>Musee_ext, debut: date, fin: date)
<br/>
Prestataire(#IDP: integer, raison_sociale: varchar)
<br/>
Restaurer(#prestataire=>Prestataire, #oeuvre=>Oeuvre_louvre, #fin: date, type: varchar, montant: integer)
<br/>
Expo_perm(#nom: varchar)
<br/>
Expo_temp(#nom: varchar, debut: date, fin: date)
<br/>
Guide(#IDG integer, nom: varchar, prenom: varchar, adresse: text, date_embauche:date)
<br/>
Affecter_perm(#jour:Jour, #creneau:Creneau, #expoPerm=>Expo_perm(nom), #guide=>Guide)
<br/>
Affecter_temp(#expoTemp=>Expo_temp, #guide=>Guide)
<br/>
Musee_ext(#IDM:integer, nom: varchar, adresse: text, CP: varchar, ville: varchar)
<br/>
Salle(#num:integer, capacite: integer)
<br/>
Exposer(#salle=>Salle, #expo=>Expo_temp)
<br/>
Panneau(#ID: integer, #salle=>Salle, description: text)
# Types :
Types :
Type_oeuvre : enum {peinture, sculpture, photographie}
<br/>
Jour : enum {Lundi, Mardi, Mercredi, Jeudi, Vendredi, Samedi, Dimanche}
<br/>
Creneau : enum {9-11, 11-13, 13-15, 15-17}
# Contraintes :
Contraintes :
- Jointure Interne (Oeuvre_louvre, Oeuvre_ext, Oeuvre_louvre.ID = Oeuvre_ext.ID) = NULL
- Jointure Interne (Expo_perm, Expo_temp, Expo_perm.nom = Expo_temp.nom) = NULL
- On s'assurera que deux expositions dont les dates se chevauchent ne sont pas exposées dans la même salle
......
Dans expo_perm.json et expo_temp.json, nous avons utilisé une représentation avec imbrication redondante pour les guides, les salles et les panneaux, c'est à dire qu'ils sont décrits plusieurs fois dans une exposition.
Et pour les oeuvres nous avons utilisé une liste avec leur ids.
Et pour les oeuvres nous avons utilisé une liste avec leur ids, les oeuvre seraient implémentées dans un autre fichier json.
Pour écrire les tables des oeuvres en JSON, on doit adopter une des deux méthodes pour gérer les clés étrangère:<br>
-soit on met juste l'id correspondant <br>
-soit on redéfinit à chaque fois (imbrication redondante)
Si par exemple on choisit la première méthode, l'attribut auteur serait un entier et expo une liste d'entier.
L'inconvénient du NoSQL est la redondance et la possiblité de non-cohérence des données, mais a l'avantage d'être plus souple et plus rapide qu'une base de donnnées relationnelle.
\ No newline at end of file
L'inconvénient du NoSQL est la redondance et la possiblité de non-cohérence des données, mais a l'avantage d'être plus souple et plus
Membres du groupe 2 :
# GROUPE 2 - MERCREDI 13h
## Membres:
- Julie PICHON
- Barnabé SELLIER
- Martin SCHNEIDER
- Océane BORDEAU
https://mensuel.framapad.org/p/nf18projet-9qdm?lan
## Sujet
Gestion du musée du Louvre
Le musée du Louvre a besoin d'un système de gestion de ses œuvres et expositions. Vous êtes en charge de la modélisation et de l'implémentation d'une base de données permettant de répondre au problème, et développerez une interface permettant l'interaction avec ce système.
## Documents
__UML.pdf__ <br/>
__MLD.txt__ <br/>
__NCD.md__ <br/>
&ensp;&ensp;&ensp; note de clarification du projet <br/>
__init.sql__ <br/>
&ensp;&ensp;&ensp;fichier d'initialisation de la base de donnée <br/>
> - creation de tables
> - vues d'héritages
> - set signifiactif de données <br/>
__applications.py__ : <br/>
code soucre de l'application python finalisée permettant les requetes suivantes
> 1. Requêtes d'insertions :
> &ensp;&ensp;&ensp;- Insérer un autre musée
> &ensp;&ensp;&ensp;- Insérer une oeuvre
> &ensp;&ensp;&ensp;- Insérer une exposition permanente
> &ensp;&ensp;&ensp;- Insérer une exposition temporaire (et y exposer des oeuvres liée à un autre musée)
> &ensp;&ensp;&ensp;- Insérer une salle d'exposition ( et la liée a une exposition)
> &ensp;&ensp;&ensp;- Insérer un panneau explicatif sur une exposition dans une sallle
> &ensp;&ensp;&ensp;- Insérer un guide (et affectation à des exposition permanente et temporaires)<BR/>
> 2. Requêtes de Selection
> - Lister les guides avec leur identification, nom, prénom, et date d'embauche.
> - Lister toutes les informations des expositions permanentes.
> - Lister toutes les informations des expositions temporaires en cours et futures, ainsi que les identifications et noms des salles qui leur sont attribuées.
> - Afficher les identifications des guides participant à une exposition donnée (gérer cas exposition permanente et exposition temporaire).
> - Afficher le nombre d'oeuvres et le prix moyen d'acquisition des oeuvres d'une exposition donnée.
> - Lister les oeuvres appartenant au Louvre (identification unique, titre, dates et type), triées dans cet ordre par type, par date, par titre.
> - Identifier de manière unique les oeuvres actuellement prêtées (pas les prêts passés ni futurs) par le Louvre, avec la date de fin du prêt, triées par date de fin du prêt.
> - Afficher le temps moyen des prêts avec chaque musée extérieur, identifié de manière unique et avec leur nom et adresse (groupé par musée).
> - Indiquer pour chaque oeuvre (inclure les oeuvres appartenant à des musées extérieurs) : le prix d'acquisition, le nombre de restaurations qu'elle a subi, et le coût cumulé des restaurations.
> - Compter le nombre d'oeuvres actuellement absentes (= en prêt ou en restauration), groupées par exposition permanente identifiée de manière unique.
> - Identifier de manière unique les oeuvres actuellement empruntées par le Louvre, avec l'identification unique et le titre de l'exposition temporaire où elles sont exposées, avec la date de fin de l'emprunt, triées par date de fin de l'emprunt.
> - Afficher les oeuvres ayant été créées à une période donnée, avec toutes leurs informations ainsi que l'identification unique, nom, si elles appartiennent ou non au Louvre, les durées éventuelles des expositions dans lesquelles elles sont/ont été/seront exposées.
> - Compter le nombre de créneaux d'attribution de visite d'expositions permanentes par guide (avec toutes les informations des guides, pas de distinction par exposition).
> - Compter le nombre d'expositions accueillies par salles, par ordre décroissant, avec la durée cumulée, ainsi que l'affichage de toutes les informations de la salle.<br/>
__expo_temp.json__ <br/>
__expo_perm.json__ <br/>
deux fichiers json offrant une modelisation alternative non relationnelle <br/>
__Nosql.md__ <br/>
fichier d'explication et d'argumentation sur les solutions NoSQL et R-JSON <br/>
relationnel à modifier:
- heritage oeuvre
- pret et emprunter
- restaurer : date en clé
- clarification chevaucher exposer
- contraintes complexes
......@@ -133,9 +133,9 @@ def liste_expos_permanentes():
raw = cur.fetchone()
print("\nListe des expositions permanentes")
while raw:
print(f"Nom de l'exposition : {raw[0]}\n")
print()
print(f"Nom de l'exposition : {raw[0]}")
raw = cur.fetchone()
print()
def liste_expos_temporaires():
......@@ -172,25 +172,43 @@ def liste_oeuvres_louvre():
def info_expo():
cur = conn.cursor()
tmp = 0
sql = "SELECT nom from expo_perm;"
cur.execute(sql)
raw = cur.fetchone()
print("\nLes exposition permanentes sont:")
while raw:
print(f"{raw[0]}")
raw = cur.fetchone()
print()
sql = "SELECT nom from expo_temp;"
cur.execute(sql)
raw = cur.fetchone()
print("Les exposition temporaires sont:")
while raw:
print(f"{raw[0]}")
raw = cur.fetchone()
print()
nom = input(
"\nVous voulez connaitre des informations sur quelle exposition ?")
"Vous voulez connaitre des informations sur quelle exposition ?\n")
sql = f"SELECT expo, Count(*), Avg(prix_acq) FROM OEUVRE_LOUVRE GROUP BY expo HAVING expo='{nom}'"
cur.execute(sql)
raw = cur.fetchone()
if raw:
print(f"Exposition {raw[0]}")
print(f"\nExposition : {raw[0]}")
print(f" Nombre d'oeuvres : {raw[1]}")
print(f" Prix moyen d'acquisition : {raw[2]:.2f}")
print()
tmp = 1
sql = f"SELECT expo, Count(*) FROM OEUVRE_EXT GROUP BY expo HAVING expo='{nom}'"
cur.execute(sql)
raw = cur.fetchone()
if raw:
print(f"Exposition {raw[0]}")
print(f"\nExposition {raw[0]}")
print(f" Nombre d'oeuvres : {raw[1]}")
print()
tmp = 1
if tmp == 0:
print("L'exposition n'existe pas")
print("\nL'exposition n'existe pas\n")
def afficher_guide_expo():
......@@ -200,14 +218,28 @@ def afficher_guide_expo():
choixExpo = input(
"\nExposition permanente (1) ou exposition temporaire (2)\n")
expo = input("\nEntrez le nom de l'exposition:\n")
if(choixExpo == '1'):
sql = "SELECT nom from expo_perm;"
cur.execute(sql)
raw = cur.fetchone()
print("\nLes exposition permanentes sont:")
while raw:
print(f"{raw[0]}")
raw = cur.fetchone()
expocol = "expoperm"
affecter = "affecter_perm"
else:
sql = "SELECT nom from expo_temp;"
cur.execute(sql)
raw = cur.fetchone()
print("\nLes exposition temporaires sont:")
while raw:
print(f"{raw[0]}")
raw = cur.fetchone()
expocol = "expotemp"
affecter = "affecter_temp"
expo = input("\nEntrez le nom de l'exposition:\n")
sql = f"SELECT idg, nom, prenom FROM guide JOIN {affecter} as a ON a.guide=guide.idg WHERE a.{expocol} = '{expo}' GROUP BY nom, prenom, idg;"
cur.execute(sql)
......@@ -302,14 +334,14 @@ def liste_oeuvre_periode():
def temp_moyen_pret():
cur = conn.cursor()
sql = "SELECT idm, nom, adresse, AVG(ROUND(fin - debut)) FROM Prete JOIN Musee_ext ON prete.musee = musee_ext.IDM GROUP BY idm, musee_ext adresse, nom;"
sql = "SELECT idm, nom, adresse, AVG(ROUND(fin - debut)) FROM Prete JOIN Musee_ext ON prete.musee = musee_ext.IDM GROUP BY idm, musee_ext, adresse, nom;"
cur.execute(sql)
raw = cur.fetchone()
print("Temps moyen d'un prêt (par musée):")
while raw:
print(f"musée partenaire : {raw[0]} :")
print(f" adresse : {raw[1]}")
print(f" temps moyen des prêts : {raw[2]} jours")
print(f"musée partenaire : {raw[1]}")
print(f" adresse : {raw[2]}")
print(f" temps moyen des prêts : {raw[3]} jours")
print()
raw = cur.fetchone()
......@@ -324,13 +356,17 @@ def informations_oeuvres():
print("Informations sur chaque oeuvre :")
while raw:
if raw[2] != None:
print(f"Nom de l'oeuvre : {raw[1]} (id:{raw[0]}) ")
print(f" prix d'acquisition : {raw[2]}")
print(f" prix total des {raw[3]} rennovation {raw[4]} euros ")
print(f"Nom de l'oeuvre : {raw[1]}")
print(f" Prix d'acquisition : {raw[2]}")
if raw[3] != 0:
print(
f" Prix total des {raw[3]} rennovation {raw[4]} euros")
else:
print(" Cette oeuvre n'a jamais été restaurée")
print()
else:
print(f"Nom de l'oeuvre : {raw[1]} (id:{raw[0]}) ")
print(" empruntée d'un autre musée")
print(f"Nom de l'oeuvre : {raw[1]}")
print(" Empruntée d'un autre musée")
print()
raw = cur.fetchone()
......
......@@ -154,6 +154,10 @@ CREATE TABLE Panneau(
PRIMARY KEY (ID, salle)
);
CREATE view vOeuvres as
SELECT oe.ido, oe.titre, oe.dimensions, oe.type, oe.date_crea, oe.auteur, NULL as prix, NULL as dateacq FROM oeuvre_ext oe
UNION ALL
SELECT ol.ido, ol.titre, ol.dimensions, ol.type, ol.date_crea, ol.auteur, ol.prix_acq as prix, ol.date_acq as dates FROM oeuvre_louvre ol;
CREATE VIEW vExpos AS
SELECT * FROM Expo_Perm
UNION ALL
......@@ -171,11 +175,13 @@ INSERT INTO Expo_temp VALUES ('Cubisme', TO_DATE('2021-12-01', 'YYYY-MM-DD'), TO
INSERT INTO Expo_temp VALUES ('Surréalisme', TO_DATE('2021-01-01', 'YYYY-MM-DD'), TO_DATE('2024-01-01', 'YYYY-MM-DD'));
INSERT INTO Expo_perm VALUES ('Femmes');
INSERT INTO Expo_perm VALUES ('Grece antique');
INSERT INTO Musee_ext (nom, adresse, CP, ville) VALUES ('Musée Rodin', '77 rue de Varenne', '75007', 'Paris');
INSERT INTO Musee_ext (nom, adresse, CP, ville) VALUES ('Museo nacional centro de arte Reina Sofia', 'Santa Isabel 52', '28012', 'Madrid');
INSERT INTO Musee_ext (nom, adresse, CP, ville) VALUES ('Musée de l''Orangerie', 'Jardin des Tuileries', '75001', 'Paris');
INSERT INTO Musee_ext (nom, adresse, CP, ville) VALUES ('Musée d''Orsay', '62 rue de Lille', '75007', 'Paris');
INSERT INTO Musee_ext (nom, adresse, CP, ville) VALUES ('Centre Georges Pompidou', 'place Georges-Pompidou', '75004', 'Paris');
INSERT INTO Oeuvre_ext (titre, dimensions, type, date_crea, auteur, expo) VALUES ('Le penseur', '1.8 x 0.98 x 1.45', 'sculpture', 1880, 1, 'Impressionniste');
INSERT INTO Oeuvre_ext (titre, dimensions, type, date_crea, auteur, expo) VALUES ('Les nymphéas', '0.219 x 0.602', 'peinture', 1920, 3, 'Impressionniste');
......@@ -185,6 +191,8 @@ INSERT INTO Oeuvre_ext (titre, dimensions, type, date_crea, auteur, expo) VALUES
INSERT INTO Oeuvre_louvre (titre, dimensions, type, date_crea, auteur, prix_acq, date_acq, expo) VALUES ('La joconde', '0.77 x 0.53', 'peinture', 1510, 2, 10000000, TO_DATE('1990-01-01', 'YYYY-MM-DD'), 'Femmes');
INSERT INTO Oeuvre_louvre (titre, dimensions, type, date_crea, auteur, prix_acq, date_acq) VALUES ('Annonciation', '0.98 x 0.217', 'peinture', 1480, 2, 10000, TO_DATE('2001-04-01', 'YYYY-MM-DD'));
INSERT INTO Oeuvre_louvre (titre, dimensions, type, date_crea, auteur, prix_acq, date_acq, expo) VALUES ('Autopotrait', '0.81 x 0.60', 'peinture', 1901, 4, 20000, TO_DATE('2006-07-01', 'YYYY-MM-DD'), 'Cubisme');
INSERT INTO Oeuvre_louvre (titre, dimensions, type, date_crea, auteur, prix_acq, date_acq, expo) VALUES ('hydre', '1.00 x 0.53', 'sculpture', 810, 5, 1906500, TO_DATE('1890-01-01', 'YYYY-MM-DD'), 'Grece antique');
INSERT INTO Prete VALUES (1, 1, TO_DATE('2020-01-01', 'YYYY-MM-DD'), TO_DATE('2022-01-01', 'YYYY-MM-DD'));
INSERT INTO Prete VALUES (2, 3, TO_DATE('2021-05-01', 'YYYY-MM-DD'), TO_DATE('2024-06-01', 'YYYY-MM-DD'));
......@@ -197,6 +205,7 @@ INSERT INTO Emprunte VALUES (2, 4, TO_DATE('2020-08-01', 'YYYY-MM-DD'), TO_DATE(
INSERT INTO Prestataire (raison_sociale) VALUES ('PME');
INSERT INTO Restaurer VALUES (1, 2, 'Dorures', TO_DATE('2021-11-10', 'YYYY-MM-DD'), 15000);
INSERT INTO Restaurer VALUES (1, 3, 'Traitement de lumière', TO_DATE('2022-05-06', 'YYYY-MM-DD'), 15000);
INSERT INTO Guide (nom, prenom, adresse, date_embauche) VALUES ('Schneider', 'Martin', '8 BLVD VICTOR HUGO', TO_DATE('2020-05-01', 'YYYY-MM-DD'));
INSERT INTO Guide (nom, prenom, adresse, date_embauche) VALUES ('Sellier', 'Barnabé', '15 RUE DES LOMBARDS', TO_DATE('2021-07-01', 'YYYY-MM-DD'));
......@@ -220,7 +229,3 @@ INSERT INTO Affecter_perm VALUES ('Femmes', 1, 'Lundi', '11-13');
INSERT INTO Affecter_perm VALUES ('Femmes', 1, 'Lundi', '13-15');
INSERT INTO Affecter_perm VALUES ('Femmes', 2, 'Mardi', '9-11');
INSERT INTO Affecter_perm VALUES ('Femmes', 2, 'Mardi', '13-15');
INSERT INTO Expo_perm VALUES ('Grece antique');
INSERT INTO Oeuvre_louvre (titre, dimensions, type, date_crea, auteur, prix_acq, date_acq, expo) VALUES ('hydre', '1.00 x 0.53', 'sculpture', 810, 5, 1906500, TO_DATE('1890-01-01', 'YYYY-MM-DD'), 'Grece antique');
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment