Beispiele / Bibliotheksverwaltung
Bibliotheksverwaltung
Das Schema einer Bibliothek beruht auf einer Trennung. Das Buch ist ein Titel im Katalog, das Exemplar ist der physische Band im Regal. Mitglieder leihen Exemplare aus, keine Bücher, aber Vormerkungen gelten dem Buch. Autoren hängen über eine Zwischentabelle daran, weil ein Buch mehrere Autoren haben kann.
Unten zeichnet ErdDocs dieses Schema aus seinem SQL, mit allen Tabellen und Beziehungen. Im Reiter „Data Dictionary“ finden Sie das druckbare Nachschlagewerk, vollständig und kostenlos auf dieser Seite. Das SQL steht weiter unten.
Fahren Sie über eine Tabelle, um ihre Beziehungen hervorzuheben. Ein Klick hält sie fest.
Wozu jede Tabelle dient
- books / copiesKatalogeintrag und Exemplar mit Barcode. Die meisten Bibliotheksaufgaben laufen auf diese Trennung hinaus.
- authors / book_authorsEine n:m-Beziehung. Ein Buch mit zwei Autoren sprengt eine direkte author_id sofort.
- memberscard_no, die Ausweisnummer, ist die Kennung, die Menschen benutzen.
- loansHängt am Exemplar, denn man muss wissen, welcher Band genau draußen und überfällig ist.
- reservationsHängt am Buch. Das Mitglied will den Titel, und es ist egal, welches Exemplar zuerst zurückkommt.
Entwurfsentscheidungen zum Übernehmen
- Ausleihen zeigen auf Exemplare, Vormerkungen auf Bücher. Wer die beiden Ebenen vermischt, macht den klassischen Fehler. Dann kann das Schema weder sagen, wer genau diesen Band hat, noch, wen es als Nächsten benachrichtigen soll.
- returned_on darf NULL sein. Das ersetzt ein Feld „zurückgegeben“, und das Datum steht gleich in derselben Spalte.
- Die ISBN ist eindeutig, darf aber NULL sein. Alte und interne Medien ohne ISBN gibt es wirklich. Mit NOT NULL würden echte Daten gegen das Constraint verstoßen.
Das SQL
PostgreSQL-Dialekt. Im Tool oben steht dieses SQL schon. Sie dürfen es frei kopieren und in die eigene Datenbank oder eine Migration übernehmen.
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 für Bestände vor der ISBN oder interne Medien';
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 'Der physische Band; ein gefragtes Buch hat viele Exemplare';
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, solange das Exemplar ausgeliehen ist';
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 'Vormerkung auf das BUCH – jedes zurückgegebene Exemplar erfüllt sie';Häufige Fragen
Wohin gehören Mahngebühren?
In eine Tabelle fines, die auf loans verweist, denn der Grund ist die überfällige Ausleihe. Sie enthält Betrag, Datum und Zahlungsdatum. Für eine Übung reicht es auch, die Gebühr jedes Mal aus dem Fälligkeitsdatum zu berechnen. Wichtig ist, dass Sie die Wahl begründen.
Was ändern E-Books am Schema?
E-Books haben keine Exemplare, deshalb wird die Ausleihe zur Lizenzfrage. Sie können neben copies eine Tabelle licenses anlegen, die N gleichzeitige Ausleihen erlaubt. Oder Sie hängen Ausleihen direkt an das Buch und prüfen in der Anwendung, wie viele gleichzeitig laufen.