# 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)