Коротка відповідь
juniorСхема складається з таблиць Books, Authors, Patrons, Loans. Books має FK на Authors; Loans зв’язує Books і Patrons з датами позики та повернення.
Повне пояснення
Що це і навіщо
- Схема бази даних для бібліотеки дозволяє зберігати інформацію про книги, авторів, користувачів і позики. Вона забезпечує цілісність даних через зовнішні ключі.
Ключові принципи/терміни
- Primary key (PK) – унікальний ідентифікатор запису.
- Foreign key (FK) – посилання на PK іншої таблиці, що гарантує зв’язок.
- Referential integrity – обмеження, що запобігають «загубленим» посиланням.
Як це працює
- При вставці запису в таблицю
LoansСУБД перевіряє, що значенняbook_idіснує вBooks, аpatron_id– вPatrons. Якщо ні, транзакція відхиляється.
Практика й реалізація (PostgreSQL)
CREATE TABLE Authors (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL
);
CREATE TABLE Books (
id SERIAL PRIMARY KEY,
title TEXT NOT NULL,
author_id INT REFERENCES Authors(id)
);
CREATE TABLE Patrons (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
email TEXT UNIQUE
);
CREATE TABLE Loans (
id SERIAL PRIMARY KEY,
book_id INT REFERENCES Books(id),
patron_id INT REFERENCES Patrons(id),
loan_date DATE NOT NULL,
return_date DATE
);
Тестування
- Unit: перевірка функцій вставки/видалення через
pg-memабоjest-pg. - Integration: використати
Prismaдля генерації моделей і тестувати черезsupertest.
Оптимізація запитів
- Індекси на
Books.author_id,Loans.book_idіLoans.patron_id. - Використовувати
EXPLAIN ANALYZEдля перевірки плану виконання.
Безпека
- Підтримка ролей:
librarian,patron. - Валідація вхідних даних на рівні API, щоб уникнути SQL‑ін’єкцій.
Особливості в контексті ORM
- У
Prismaце будеmodel Book { id Int @id @default(autoincrement()) title String author Author @relation(fields: [authorId], references: [id]) }.
Часті помилки
- Вставка позики без існуючого
book_id. - Дублікати унікальних полів (наприклад, email).
- Відсутність індексу на колонку пошуку.
- Перевищення ліміту одночасних транзакцій.
- Неправильне використання
ON DELETE CASCADE– видалення автора видаляє всі книги. - Застарілі типи даних (наприклад,
VARCHARбез довжини). - Необроблені помилки при підключенні до БД.
- Погане управління транзакціями – часткові оновлення.
Cheatsheet
CREATE TABLE …– визначає структуру.PRIMARY KEY,FOREIGN KEY– забезпечують цілісність.INSERT … ON CONFLICT DO NOTHING– уникнення дублікати.EXPLAIN ANALYZE– аналіз плану.
Follow‑up питання
- Як реалізувати історію позик?
- Які переваги
ON DELETE SET NULLнадCASCADE? - Як масштабувати схему при великій кількості користувачів?