Library Management System
Thiết kế database cho hệ thống quản lý thư viện
Problem to Solve
Bạn được giao nhiệm vụ thiết kế và xây dựng cơ sở dữ liệu cho một hệ thống quản lý thư viện. Hệ thống cần lưu trữ thông tin về sách, tác giả, thể loại, thành viên và các giao dịch mượn/trả sách.
Background
Một hệ thống quản lý thư viện hiệu quả cần:
- Tính toàn vẹn dữ liệu: Đảm bảo dữ liệu chính xác và nhất quán
- Mối quan hệ rõ ràng: Liên kết giữa sách, tác giả, và giao dịch mượn
- Truy vấn hiệu quả: Tìm kiếm sách, theo dõi tình trạng mượn
- Chuẩn hóa: Tránh trùng lặp dữ liệu
Specification
Tables cần tạo
1. categories - Thể loại sách
- id (INTEGER, PRIMARY KEY)
- name (TEXT, NOT NULL, UNIQUE)
- description (TEXT)
2. authors - Thông tin tác giả
- id (INTEGER, PRIMARY KEY)
- name (TEXT, NOT NULL)
- bio (TEXT)
- birth_year (INTEGER)
3. books - Thông tin sách
- id (INTEGER, PRIMARY KEY)
- title (TEXT, NOT NULL)
- isbn (TEXT, UNIQUE)
- published_year (INTEGER)
- category_id (INTEGER, FOREIGN KEY → categories.id)
- copies_available (INTEGER, DEFAULT 1)
4. book_authors - Quan hệ nhiều-nhiều giữa sách và tác giả
- book_id (INTEGER, FOREIGN KEY → books.id)
- author_id (INTEGER, FOREIGN KEY → authors.id)
- PRIMARY KEY (book_id, author_id)
5. members - Thông tin thành viên
- id (INTEGER, PRIMARY KEY)
- name (TEXT, NOT NULL)
- email (TEXT, UNIQUE)
- phone (TEXT)
- membership_date (DATE, DEFAULT CURRENT_DATE)
6. borrowings - Thông tin mượn sách
- id (INTEGER, PRIMARY KEY)
- book_id (INTEGER, FOREIGN KEY → books.id)
- member_id (INTEGER, FOREIGN KEY → members.id)
- borrow_date (DATE, NOT NULL)
- due_date (DATE, NOT NULL)
- return_date (DATE)
- status (TEXT, CHECK IN ('borrowed', 'returned', 'overdue'))
Queries cần viết
- Tìm sách chưa được trả - Liệt kê tất cả sách đang được mượn
- Top 5 thành viên mượn nhiều sách nhất
- Sách phổ biến nhất - Top 10 sách được mượn nhiều nhất
- Sách quá hạn - Sách chưa trả và đã quá due_date
- Tìm sách theo tác giả hoặc thể loại
Sample Data
Thêm ít nhất:
- 5 thể loại
- 10 tác giả
- 20 cuốn sách
- 10 thành viên
- 30 giao dịch mượn sách (cả đã trả và chưa trả)
Hints
- Sử dụng
FOREIGN KEY ... REFERENCESđể tạo quan hệ - Dùng
CREATE INDEXcho các cột thường được tìm kiếm (title, isbn, name) - Dùng
CHECKconstraint để giới hạn giá trị hợp lệ - Sử dụng
JOINđể kết hợp dữ liệu từ nhiều bảng - Dùng
GROUP BYvàCOUNT()cho các thống kê
Getting Started
Log into cs50.dev using your GitHub account and click Authorize cs50, then close the tab.
How to check / Cách kiểm tra
Chạy:
check50 --local uet36/problems/2025/database/library_system
How to submit / Cách nộp
Chạy:
submit50 --local uet36/problems/2025/database/library_system