> Как описать схему базы данных для модели библиотеки с сущностями автор, книга, читатель и связями между ними (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:
SQLCREATE 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) с соответствующими структурами:
GOtype Author struct {ID uint `gorm:"primaryKey"`Name stringBirthYear *intBooks []Book}type Book struct {ID uint `gorm:"primaryKey"`Title stringISBN string `gorm:"uniqueIndex"`Year intAuthorID uintAuthor Author}type Reader struct {ID uint `gorm:"primaryKey"`Name stringEmail string `gorm:"uniqueIndex"`RegistrationDate time.TimeBorrowings []Borrowing}type Borrowing struct {ID uint `gorm:"primaryKey"`ReaderID uintBookID uintBorrowDate time.TimeReturnDate *time.TimeReader ReaderBook Book}
Такая схема обеспечивает нормализацию, целостность данных и удобство запросов (например, получить все книги автора или историю читателя).
> Похожие задачи по Go
Происходит ли копирование данных при передаче слайса и массива в функцию в Go
Какие сигналы существуют в операционной системе
Какую архитектуру и технологии использовать для реализации клиента чата с REST API?
Работал ли ты с Cassandra, MongoDB, Redis, ElasticSearch, ClickHouse
> Похожие задачи по backend
Происходит ли копирование данных при передаче слайса и массива в функцию в Go
Какие сигналы существуют в операционной системе
Какую архитектуру и технологии использовать для реализации клиента чата с REST API?
Работал ли ты с Cassandra, MongoDB, Redis, ElasticSearch, ClickHouse
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью