2025-10-28 11:29:40 +01:00

136 lines
4.9 KiB
SQL

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