ErdDocs

Ví dụ / Hệ thống quản lý thư viện

Hệ thống quản lý thư viện

Lược đồ thư viện dựa trên sự tách biệt giữa cuốn sách và bản sao. Cuốn sách là một nhan đề trong mục lục, còn bản sao là cuốn sách thật trên kệ. Độc giả mượn bản sao chứ không mượn sách. Còn đặt trước thì đặt theo cuốn sách. Tác giả được nối qua bảng trung gian, vì một cuốn sách có thể có nhiều tác giả.

Bên dưới, ErdDocs vẽ lược đồ này từ SQL của nó, với mọi bảng và quan hệ. Tab «Từ điển dữ liệu» có tài liệu tham chiếu để in, đầy đủ và miễn phí ngay trên trang này. Đoạn SQL nằm ở cuối trang.

Lược đồ của bạn

Rê chuột lên một bảng để làm nổi các quan hệ. Bấm chuột để giữ phần làm nổi.

Mỗi bảng làm gì

  • books / copiesMục trong danh mục và bản sao có mã vạch. Phần lớn bài tập về thư viện đều quy về sự tách biệt này.
  • authors / book_authorsQuan hệ nhiều-nhiều. Chỉ cần một cuốn sách có hai tác giả là cột author_id đặt thẳng trong books đã không dùng được.
  • memberscard_no, số thẻ độc giả, là mã định danh mà con người dùng.
  • loansLượt mượn gắn với bản sao, vì cần biết chính cuốn nào đang được mượn và đã quá hạn.
  • reservationsĐặt trước gắn với cuốn sách. Độc giả cần nhan đề, còn bản nào trả về trước cũng được.

Những quyết định thiết kế đáng học

  • Lượt mượn trỏ tới bản sao, còn đặt trước trỏ tới sách. Trộn hai cấp này là lỗi kinh điển. Khi đó, lược đồ không trả lời được «ai đang giữ đúng cuốn này», cũng không biết «cần báo cho ai tiếp theo trong hàng chờ».
  • returned_on cho phép NULL. Cột này thay cho cờ «đã trả» và đồng thời lưu luôn ngày trả.
  • ISBN là duy nhất nhưng cho phép NULL. Tài liệu cũ và tài liệu nội bộ không có ISBN vẫn tồn tại. Nếu đặt NOT NULL, dữ liệu thật sẽ vi phạm ràng buộc.

SQL

Phương ngữ PostgreSQL. Đoạn SQL này đã có sẵn trong công cụ phía trên. Bạn có thể thoải mái sao chép và đưa nó vào cơ sở dữ liệu của mình hoặc vào một 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 với tài liệu trước thời ISBN hoặc tài liệu nội bộ';

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 'Cuốn sách thật; sách được ưa chuộng có nhiều bản sao';

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 khi bản sao đang được mượn';

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 'Đặt trước trên CUỐN SÁCH – bản sao nào được trả trước cũng đáp ứng được';

Câu hỏi thường gặp

Tiền phạt quá hạn để ở đâu?

Trong bảng fines tham chiếu loans, vì tiền phạt phát sinh từ lượt mượn quá hạn. Bảng lưu số tiền, ngày phát sinh và ngày nộp. Với bài tập, bạn cũng có thể tính tiền phạt trực tiếp từ hạn trả. Điều quan trọng là giải thích được lựa chọn của mình.

Sách điện tử thay đổi lược đồ thế nào?

Sách điện tử không có bản sao, nên việc mượn trở thành chuyện giấy phép. Cách thứ nhất là thêm bảng licenses song song với copies, ghi số lượt mượn đồng thời được phép. Cách thứ hai là gắn lượt mượn thẳng vào sách và kiểm tra số lượt đồng thời trong ứng dụng.

Ví dụ khác