# Schema relationnel ### Ressource Ressource(#code : ENTIER, genre : VARCHAR, ISBN : ENTIER, resume : VARCHAR, langue : VARCHAR, synopsis[0..1] : VARCHAR, longueur : VARCHAR, t = {'L', 'F', 'E'}) avec ISBN unique #### Contraintes ressources : ##### Héritage presque complet (par mère) * ( t = 'L' AND ISBN IS NOT NULL AND langue IS NOT NULL AND longueur IS NULL AND synopsis IS NULL) OR ( t = 'F' AND longueur IS NOT NULL AND langue IS NOT NULL AND ISBN IS NULL AND resume IS NULL) OR ( t = 'E' And longueur AND ISBN IS NULL AND langue IS NULL AND synopsis IS NULL AND resume is NULL) ##### Héritage exclusif * INTERSECTION (PROJECTION(Restriction(Ressource,t='E'),code), PROJECTION(Restriction(Ressource,t='L'),code), PROJECTION(Restriction(Ressource,t='F'),code)) = {} ### Information Information(#titre : VARCHAR, #date_apparition : DATE, #editeur : VARCHAR, #code_ressource => Ressource, prix : REEL) avec {titre,date_apparition,editeur} unique AND code_ressource unique ### Exemplaire Exemplaire ( #code_exemplaire : ENTIER, #code_ressource => Ressource, #ajoute_par => Personnel, etat : {'neuf', 'bon', 'abime', 'perdu'}, code_classification : ENTIER) avec ajoute_par NOT NULL #### Contraintes exemplaire et ressource * PROJECTION(Exemplaire, code_ressource) = PROJECTION(Ressource, code) #### Contraintes exemplaire et personnel (ajoute) * PROJECTION(Exemplaire, ajoute_par) = PROJECTION(Personnel, email) ### Contributeur Contributeur(#id : ENTIER , prenom : VARCHAR, nom : VARCHAR, nationalite : VARCHAR , date_naissance : date, t = {Auteur,compositeur,interprete,realisateur,acteur} ) Contribue ( #code => ressource, #id => contributeur) #### Contrainte entre ressource et contributeur : (cardinalité minimale de 1) * PROJECTION(Contribue,id)=PROJECTION(Contributeur,id) AND PROJECTION(Contribue,code)=PROJECTION(Ressource,code) ### Classes d'associations entre adhérents et exemplaires * Emprunt(#email => adherent, #code => Exemplaire, date_debut : DATE, date_pret : DATE, date_fin_reel : DATE) * Sanction (#email => adherent, #code => Exemplaire, date_sanction : DATE, jour_retard : ENTIER, etat_retour : {'abime','perdu'}, frais : ENTIER, t = { 'retard', 'remboursement'}) ##### Héritage exclusif et non complet * ( t = 'retard' AND jours_retard NOT NULL AND frais IS NULL AND etat_retour IS NULL) OR ( t = 'remboursement' AND frais NOT NULL AND etat_retour NOT NULL AND jours_retard IS NULL) * INTERSECTION(PROJECTION(RESTRICTION(Sanction,t='remboursement'), email, code) , PROJECTION(RESTRICTION(Sanction,t='retard'), email, code)) = {} ### Utilisateurs Adherent ( #email : VARCHAR, ajoute_par => Personnel, nom : VARCHAR, prenom : VARCHAR, adresse[0..1] : VARCHAR, numero_tel : VARCHAR, date_naissance : DATE, sanctionne : booleen, blackliste : booleen) Personnel ( #email : VARCHAR, #code_ressource => Ressource, nom : VARCHAR, prenom : VARCHAR, adresse[0..1] : VARCHAR) avec code_ressource unique #### Contrainte de cardinalité minimale * Personnel.email NOT NULL * PROJECTION(Personnel,email) = PROJECTION(Adherent, ajoute_par) Propose (#email_a => Adherent, #code_ressource => Ressource ) #### Contrainte de cardinalité minimale * PROJECTION(Propose,code_ressource) = PROJECTION(Ressource, code) ### Compte Compte(#login : VARCHAR, #email_a => Adherent, #email_p => Personnel, mdp : VARCHAR) #### Contrainte de Compte * Adherent.email NOT NULL * email_a XOR email_p * PROJECTION(Personnel,email) = PROJECTION(Compte, email_p) AND PROJECTION(Adherent,email) = PROJECTION(Compte, email_a) ### Periode adhesion Periode_adhesion(#numero_adhesion: ENTIER, date_debut : DATE, date_fin : DATE) Est_valable_dans(#numero_a => Periode_adhesion, #email_a => Adherent) #### Contraintes entre adhérents et periode adhesion * PROJECTION(Adherent, email) = PROJECTION(Est_valable,email_a) AND PROJECTION(Periode_adhesion,numero_adhesioin) = PROJECTION(Est_valable_dans, numero_a)