Как ответить
ORM (Object-Relational Mapping) — это подход, который позволяет работать с реляционной базой данных через объекты языка программирования, не пиша SQL вручную. Вы описываете таблицу как класс, а строки — как экземпляры этого класса. ORM сама генерирует запросы INSERT, SELECT, UPDATE, DELETE. Основная цель — ускорить разработку и снизить количество шаблонного кода.
Вот как это выглядит на Python с SQLAlchemy:
from sqlalchemy import Column, Integer, String, create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String)
email = Column(String)
engine = create_engine('sqlite:///example.db')
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session = Session()
# Вставка
new_user = User(name='Иван', email='ivan@example.com')
session.add(new_user)
session.commit()
# Запрос
user = session.query(User).filter_by(name='Иван').first()
print(user.email)
За счёт такой абстракции вы быстрее пишете CRUD, меньше ошибаетесь с синтаксисом SQL, и код становится независимым от конкретной СУБД (можно сменить PostgreSQL на MySQL, поменяв только строку подключения).
Но у ORM есть и обратная сторона:
- Производительность — ORM может генерировать неоптимальные запросы, особенно при сложных JOIN или агрегатах. Каждый объект создаётся с накладными расходами.
- Проблема N+1 — если у модели есть связанные сущности, ORM может выполнять отдельный запрос для каждого parent-объекта. Например, загрузили 100 заказов, а затем для каждого делаем запрос клиента. Итог: 101 запрос вместо одного с JOIN.
- Потеря контроля — когда нужно сделать сложный запрос с оконными функциями или специфическим синтаксисом, проще написать чистый SQL.
Для junior-разработчика важно понимать: ORM — это удобный инструмент, но он не отменяет знания SQL. Вы должны уметь профилировать сгенерированные запросы (например, через echo=True в SQLAlchemy) и вовремя заменять ORM-операции на сырой SQL или использовать оптимизации (selectinload, joinedload для жадной загрузки).
Итог: ORM решает проблему «объектно-реляционного несоответствия», ускоряет типовые операции, но требует понимания, что под капотом всё равно SQL. Хороший разработчик комбинирует ORM и прямой SQL в зависимости от задачи.