ErdDocs

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.

Votre schéma

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.

Autres exemples