Exemples / Gestion de bibliothèque
Gestion de bibliothèque
Le schéma d’une bibliothèque repose sur une distinction. Le livre est un titre au catalogue, l’exemplaire est le volume physique sur l’étagère. Les adhérents empruntent des exemplaires, pas des livres, alors que les réservations portent sur le livre. Les auteurs sont reliés par une table d’association, car un livre peut avoir plusieurs auteurs.
Ci-dessous, ErdDocs dessine ce schéma à partir de son SQL, avec toutes les tables et relations. L’onglet « Dictionnaire de données » contient la version imprimable, complète et gratuite sur cette page. Le SQL se trouve plus bas.
Survolez une table pour mettre en évidence ses relations. Un clic les fige.
Le rôle de chaque table
- books / copiesLa notice du catalogue et l’exemplaire à code-barres. La plupart des exercices de bibliothèque se ramènent à cette distinction.
- authors / book_authorsUne relation plusieurs à plusieurs. Avec un livre à deux auteurs, un author_id direct ne tient plus.
- membersLes gens utilisent le numéro de carte, card_no.
- loansL’emprunt est rattaché à l’exemplaire, car il faut savoir quel volume est sorti et en retard.
- reservationsLa réservation est rattachée au livre. L’adhérent veut le titre, quel que soit l’exemplaire rendu en premier.
Des choix de conception à reprendre
- Les emprunts visent les exemplaires, les réservations les livres. Mélanger les deux niveaux est l’erreur classique. Le schéma ne sait plus répondre ni à « qui a ce volume précis » ni à « qui prévenir en premier ».
- returned_on accepte NULL. Il remplace ainsi un champ « rendu » et garde la date dans la même colonne.
- L’ISBN est unique mais accepte NULL. Il existe des ouvrages anciens et internes sans ISBN, et avec un NOT NULL des données réelles violeraient la contrainte.
Le SQL
Dialecte PostgreSQL. Ce SQL est déjà dans l’outil ci-dessus, et vous pouvez le copier librement dans votre base ou dans une migration.
CREATE TABLE authors (
id bigserial PRIMARY KEY,
full_name varchar(120) NOT NULL
);
CREATE TABLE books (
id bigserial PRIMARY KEY,
isbn varchar(17) UNIQUE,
title varchar(240) NOT NULL,
published smallint
);
COMMENT ON COLUMN books.isbn IS 'NULL pour les ouvrages antérieurs à l’ISBN ou les documents internes';
CREATE TABLE book_authors (
book_id bigint NOT NULL REFERENCES books(id),
author_id bigint NOT NULL REFERENCES authors(id),
PRIMARY KEY (book_id, author_id)
);
CREATE TABLE copies (
id bigserial PRIMARY KEY,
book_id bigint NOT NULL REFERENCES books(id),
barcode varchar(20) NOT NULL UNIQUE,
shelf varchar(20),
condition varchar(20) NOT NULL DEFAULT 'good'
);
COMMENT ON TABLE copies IS 'Le volume physique ; un livre demandé a plusieurs exemplaires';
CREATE TABLE members (
id bigserial PRIMARY KEY,
card_no varchar(20) NOT NULL UNIQUE,
full_name varchar(120) NOT NULL,
joined_on date NOT NULL
);
CREATE TABLE loans (
id bigserial PRIMARY KEY,
copy_id bigint NOT NULL REFERENCES copies(id),
member_id bigint NOT NULL REFERENCES members(id),
loaned_on date NOT NULL,
due_on date NOT NULL,
returned_on date
);
COMMENT ON COLUMN loans.returned_on IS 'NULL tant que l’exemplaire est emprunté';
CREATE TABLE reservations (
id bigserial PRIMARY KEY,
book_id bigint NOT NULL REFERENCES books(id),
member_id bigint NOT NULL REFERENCES members(id),
placed_at timestamptz NOT NULL DEFAULT now(),
fulfilled boolean NOT NULL DEFAULT false
);
COMMENT ON TABLE reservations IS 'Réservation sur le LIVRE : n’importe quel exemplaire rendu la satisfait';Questions fréquentes
Où mettre les pénalités de retard ?
Dans une table fines qui référence loans, puisque la pénalité vient d’un emprunt en retard. Elle contient le montant, la date et la date de paiement. Pour un exercice, on peut aussi les calculer à la volée depuis la date d’échéance. L’essentiel est de justifier le choix.
Que changent les livres numériques ?
Un livre numérique n’a pas d’exemplaire, donc l’emprunt devient une question de licences. Vous pouvez ajouter une table licenses à côté de copies, avec le nombre d’emprunts simultanés. Vous pouvez aussi rattacher les emprunts directement au livre et contrôler leur nombre dans l’application.