-- Drop tables if they exist DROP TABLE IF EXISTS note; DROP TABLE IF EXISTS rendu_devoir; DROP TABLE IF EXISTS devoir; DROP TABLE IF EXISTS contenu_cours; DROP TABLE IF EXISTS inscription; DROP TABLE IF EXISTS enseignement; DROP TABLE IF EXISTS cours; DROP TABLE IF EXISTS utilisateur_role; DROP TABLE IF EXISTS role; DROP TABLE IF EXISTS utilisateur; -- Table utilisateur : représente un utilisateur de l'application CREATE TABLE utilisateur ( id BIGSERIAL NOT NULL, login VARCHAR(8) NOT NULL, mot_de_passe VARCHAR(255) NOT NULL, nom VARCHAR(100), prenom VARCHAR(100), email VARCHAR(255), PRIMARY KEY (id), CONSTRAINT ux_u_login UNIQUE (login), CONSTRAINT ux_u_email UNIQUE (email) ); CREATE INDEX ix_u_login ON utilisateur (login); -- Table role : représente un rôle d'utilisateur CREATE TABLE role ( id BIGSERIAL NOT NULL, nom VARCHAR(100) NOT NULL, PRIMARY KEY (id), CONSTRAINT ux_r_nom UNIQUE (nom) ); CREATE INDEX ix_r_nom ON role (nom); -- Table utilisateur_role : association entre utilisateurs et rôles CREATE TABLE utilisateur_role ( utilisateur_id BIGINT NOT NULL, role_id BIGINT NOT NULL, PRIMARY KEY (utilisateur_id, role_id), CONSTRAINT fk_ur_utilisateur_id FOREIGN KEY (utilisateur_id) REFERENCES utilisateur (id) ON DELETE CASCADE, CONSTRAINT fk_ur_role_id FOREIGN KEY (role_id) REFERENCES role (id) ON DELETE CASCADE ); CREATE INDEX ix_ur_utilisateur_id ON utilisateur_role (utilisateur_id); CREATE INDEX ix_ur_role_id ON utilisateur_role (role_id); -- Table cours : représente un cours CREATE TABLE cours ( id BIGSERIAL NOT NULL, nom VARCHAR(100) NOT NULL, date_debut DATE NOT NULL, PRIMARY KEY (id) ); CREATE INDEX ix_c_nom ON cours (nom); -- Table enseignement : association entre utilisateurs et cours CREATE TABLE enseignement ( utilisateur_id BIGINT NOT NULL, cours_id BIGINT NOT NULL, PRIMARY KEY (utilisateur_id, cours_id), CONSTRAINT fk_e_utilisateur_id FOREIGN KEY (utilisateur_id) REFERENCES utilisateur (id) ON DELETE CASCADE, CONSTRAINT fk_e_cours_id FOREIGN KEY (cours_id) REFERENCES cours (id) ON DELETE CASCADE ); CREATE INDEX ix_e_utilisateur_id ON enseignement (utilisateur_id); CREATE INDEX ix_e_cours_id ON enseignement (cours_id); -- Table inscription : association entre utilisateurs et cours CREATE TABLE inscription ( utilisateur_id BIGINT NOT NULL, cours_id BIGINT NOT NULL, date_inscription TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (utilisateur_id, cours_id), CONSTRAINT fk_i_utilisateur_id FOREIGN KEY (utilisateur_id) REFERENCES utilisateur (id) ON DELETE CASCADE, CONSTRAINT fk_i_cours_id FOREIGN KEY (cours_id) REFERENCES cours (id) ON DELETE CASCADE ); CREATE INDEX ix_i_utilisateur_id ON inscription (utilisateur_id); CREATE INDEX ix_i_cours_id ON inscription (cours_id); -- Table contenu_cours : représente le contenu d'un cours CREATE TABLE contenu_cours ( id BIGSERIAL NOT NULL, cours_id BIGINT NOT NULL, titre VARCHAR(255) NOT NULL, description TEXT, PRIMARY KEY (id), CONSTRAINT fk_cc_cours_id FOREIGN KEY (cours_id) REFERENCES cours (id) ON DELETE CASCADE ); CREATE INDEX ix_cc_cours_id ON contenu_cours (cours_id); -- Table devoir : représente un devoir associé à un cours CREATE TABLE devoir ( id BIGSERIAL NOT NULL, cours_id BIGINT NOT NULL, titre VARCHAR(255) NOT NULL, description TEXT, date_debut TIMESTAMP NOT NULL, date_fin TIMESTAMP NOT NULL, PRIMARY KEY (id), CONSTRAINT fk_d_cours_id FOREIGN KEY (cours_id) REFERENCES cours (id) ON DELETE CASCADE ); CREATE INDEX ix_d_cours_id ON devoir (cours_id); -- Table rendu_devoir : représente le rendu d'un devoir par un utilisateur CREATE TABLE rendu_devoir ( id BIGSERIAL NOT NULL, devoir_id BIGINT NOT NULL, utilisateur_id BIGINT NOT NULL, date_rendu TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, contenu TEXT, PRIMARY KEY (id), CONSTRAINT fk_rd_devoir_id FOREIGN KEY (devoir_id) REFERENCES devoir (id) ON DELETE CASCADE, CONSTRAINT fk_rd_utilisateur_id FOREIGN KEY (utilisateur_id) REFERENCES utilisateur (id) ON DELETE CASCADE ); CREATE INDEX ix_rd_devoir_id ON rendu_devoir (devoir_id); CREATE INDEX ix_rd_utilisateur_id ON rendu_devoir (utilisateur_id); -- Table note : représente une note attribuée à un rendu de devoir CREATE TABLE note ( id BIGSERIAL NOT NULL, rendu_devoir_id BIGINT NOT NULL, valeur DECIMAL(5, 2) NOT NULL CHECK (valeur >= 0 AND valeur <= 20), date_attribution TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), CONSTRAINT fk_n_rendu_devoir_id FOREIGN KEY (rendu_devoir_id) REFERENCES rendu_devoir (id) ON DELETE CASCADE ); CREATE INDEX ix_n_rendu_devoir_id ON note (rendu_devoir_id);