---
# System prepended metadata

title: Schema relationnel

---

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