> Как хранить книги и авторов в базе данных при связи многие-ко-многим (Python)

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

Компании: EXCORP

Стек: Python

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

Для связи "многие-ко-многим" между книгами и авторами в реляционной базе данных (например, PostgreSQL или SQLite) используется промежуточная таблица (ассоциативная). В Python с ORM SQLAlchemy это выглядит так:

PYTHON
from sqlalchemy import create_engine, Column, Integer, String, Table, ForeignKey
from sqlalchemy.orm import relationship, declarative_base
Base = declarative_base()
# Промежуточная таблица
book_author = Table(
'book_author',
Base.metadata,
Column('book_id', Integer, ForeignKey('books.id'), primary_key=True),
Column('author_id', Integer, ForeignKey('authors.id'), primary_key=True)
)
class Book(Base):
__tablename__ = 'books'
id = Column(Integer, primary_key=True)
title = Column(String, nullable=False)
authors = relationship('Author', secondary=book_author, back_populates='books')
class Author(Base):
__tablename__ = 'authors'
id = Column(Integer, primary_key=True)
name = Column(String, nullable=False)
books = relationship('Book', secondary=book_author, back_populates='authors')

Ключевые моменты:

  • Промежуточная таблица book_author содержит два внешних ключа, образующих составной первичный ключ.
  • В моделях Book и Author используется relationship с параметром secondary=book_author.
  • back_populates обеспечивает двустороннюю связь.

Пример использования:

PYTHON
book = Book(title='Война и мир')
author = Author(name='Лев Толстой')
book.authors.append(author)
session.add(book)
session.commit()

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

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

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