> Как описать схему базы данных для модели библиотеки с сущностями автор, книга, читатель и связями между ними (Go)

Уровень: senior · Роль: backend · Язык: Go · Категория: Технические вопросы

Компании: Ozon

Стек: Go

> Пример ответа

Для описания схемы базы данных библиотеки с сущностями "автор", "книга" и "читатель" в Go-проекте я бы использовал реляционную модель (например, PostgreSQL). Основные таблицы:

  • authors: id (UUID или SERIAL PRIMARY KEY), name (VARCHAR), birth_year (INT, опционально).
  • books: id, title (VARCHAR), isbn (VARCHAR UNIQUE), year (INT), author_id (FOREIGN KEY → authors.id) - связь "один ко многим" (один автор может написать много книг).
  • readers: id, name (VARCHAR), email (VARCHAR UNIQUE), registration_date (DATE).

Для связи "читатель - книга" (многие ко многим) создаём промежуточную таблицу borrowings: id, reader_id (FK → readers.id), book_id (FK → books.id), borrow_date (DATE), return_date (DATE, NULL пока не возвращена). Это позволяет отслеживать историю выдач.

Пример DDL на SQL:

SQL
CREATE TABLE authors (
id SERIAL PRIMARY KEY,
name VARCHAR(255) NOT NULL,
birth_year INT
);
CREATE TABLE books (
id SERIAL PRIMARY KEY,
title VARCHAR(255) NOT NULL,
isbn VARCHAR(20) UNIQUE NOT NULL,
year INT,
author_id INT REFERENCES authors(id) ON DELETE CASCADE
);
CREATE TABLE readers (
id SERIAL PRIMARY KEY,
name VARCHAR(255) NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL,
registration_date DATE DEFAULT CURRENT_DATE
);
CREATE TABLE borrowings (
id SERIAL PRIMARY KEY,
reader_id INT REFERENCES readers(id) ON DELETE CASCADE,
book_id INT REFERENCES books(id) ON DELETE CASCADE,
borrow_date DATE NOT NULL,
return_date DATE,
UNIQUE(reader_id, book_id, borrow_date) -- предотвращает дублирование одной выдачи
);

В Go-коде для работы с этой схемой удобно использовать ORM (например, GORM) с соответствующими структурами:

GO
type Author struct {
ID uint `gorm:"primaryKey"`
Name string
BirthYear *int
Books []Book
}
type Book struct {
ID uint `gorm:"primaryKey"`
Title string
ISBN string `gorm:"uniqueIndex"`
Year int
AuthorID uint
Author Author
}
type Reader struct {
ID uint `gorm:"primaryKey"`
Name string
Email string `gorm:"uniqueIndex"`
RegistrationDate time.Time
Borrowings []Borrowing
}
type Borrowing struct {
ID uint `gorm:"primaryKey"`
ReaderID uint
BookID uint
BorrowDate time.Time
ReturnDate *time.Time
Reader Reader
Book Book
}

Такая схема обеспечивает нормализацию, целостность данных и удобство запросов (например, получить все книги автора или историю читателя).

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью