Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+1 164новые вакансии за сутки·93 595вакансий открыто сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании7 266
РезюмеAIПодготовкаСтатьи
BoostТарифыBoost
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 401 кандидат открыт к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python17 121
  • Облачные технологии14 079
  • QA вакансии3 451
  • Backend вакансии2 115
  • Инженер данных1 805
  • Продакт-менеджер1 260

Разработка

  • Android1 862
  • iOS1 700
  • Fullstack вакансии986
  • AI вакансии950
  • Frontend вакансии744
  • Mobile вакансии44

По стеку

  • Go8 659
  • Java6 537
  • Node.js2 020
  • .NET1 721
  • Kotlin1 614
  • Rust1 455
  • C#710
  • PHP681
  • C++571

DevOps и инфраструктура

  • Kubernetes7 772
  • DevOps вакансии6 050
  • Linux-инфраструктура5 488
  • Terraform / IaC4 272
  • CI/CD3 239
  • Мониторинг и Observability1 789
  • SRE567
  • Кибербезопасность452

Аналитика и данные

  • Data Scientist1 140
  • Бизнес-аналитик923
  • Аналитик данных855
  • Системный аналитик152

Другие направления

  • Проджект-менеджер615
  • UI/UX дизайн146
  • Ручное тестирование14

По регионам

  • Вакансии в США44 276
  • Вакансии в Европе23 819
  • Вакансии в Канаде4 471
  • Работа в России3 904

По формату

  • Удалённые вакансии74 928
  • Релокация в США44 273
  • Гибридная работа12 388
  • Офисная работа7 083

По уровню

  • Senior вакансии42 627
  • Middle вакансии20 864
  • Junior вакансии6 721

Сейчас нанимают

Все компании
  • Wise190 вакансий
  • Rakuten189 вакансий
  • ASML166 вакансий
  • Grab137 вакансий
  • Celonis39 вакансий
  • Spotify37 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace16 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме SQLAlchemyВсе вопросы
SQLAlchemyMiddleТеория

Как реализовать наследование таблиц в SQLAlchemy (single-table, joined-table, concrete-table)?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

SQLAlchemy поддерживает три стратегии: STI (одна таблица, колонка-дискриминатор), JTI (JOIN между таблицами иерархии) и CTI (независимые таблицы). JTI — наиболее нормализованная, STI — быстрейшая для чтения.

Single Table Inheritance (STI)

Все подклассы хранятся в одной таблице. Колонка-дискриминатор указывает тип строки. Колонки, специфичные для подклассов, должны быть nullable.

from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
from sqlalchemy import String

class Base(DeclarativeBase):
    pass

class Animal(Base):
    __tablename__ = "animals"
    id: Mapped[int] = mapped_column(primary_key=True)
    name: Mapped[str] = mapped_column(String(100))
    type: Mapped[str] = mapped_column(String(50))   # дискриминатор

    __mapper_args__ = {
        "polymorphic_on": "type",
        "polymorphic_identity": "animal",
    }

class Dog(Animal):
    breed: Mapped[str | None] = mapped_column(String(100))
    __mapper_args__ = {"polymorphic_identity": "dog"}

class Cat(Animal):
    indoor: Mapped[bool | None] = mapped_column()
    __mapper_args__ = {"polymorphic_identity": "cat"}

Плюсы: один JOIN-less запрос, простые миграции. Минусы: много NULL-колонок, сложные CHECK-ограничения.

Наследование таблиц в SQLAlchemy

SQLAlchemy поддерживает три стратегии ORM-наследования, каждая из которых отражает разный дизайн базы данных.

Joined Table Inheritance (JTI)

Каждый класс — отдельная таблица. При запросе ORM делает JOIN. Рекомендуется для глубоких иерархий с разными наборами колонок.

class Employee(Base):
    __tablename__ = "employees"
    id: Mapped[int] = mapped_column(primary_key=True)
    name: Mapped[str] = mapped_column(String(100))
    type: Mapped[str] = mapped_column(String(50))

    __mapper_args__ = {
        "polymorphic_on": "type",
        "polymorphic_identity": "employee",
    }

class Manager(Employee):
    __tablename__ = "managers"
    id: Mapped[int] = mapped_column(ForeignKey("employees.id"), primary_key=True)
    department: Mapped[str] = mapped_column(String(100))

    __mapper_args__ = {"polymorphic_identity": "manager"}

class Engineer(Employee):
    __tablename__ = "engineers"
    id: Mapped[int] = mapped_column(ForeignKey("employees.id"), primary_key=True)
    stack: Mapped[str] = mapped_column(String(200))

    __mapper_args__ = {"polymorphic_identity": "engineer"}

Плюсы: нормализованная схема, нет NULL. Минусы: JOIN на каждый запрос, проблемы с производительностью на глубоких иерархиях.

Concrete Table Inheritance (CTI)

Каждый подкласс — полностью независимая таблица со всеми колонками. Нет JOIN, нет общей таблицы.

from sqlalchemy.orm import DeclarativeBase
from sqlalchemy import String

class Vehicle(Base):
    __abstract__ = True
    id: Mapped[int] = mapped_column(primary_key=True)
    make: Mapped[str] = mapped_column(String(100))

class Car(Vehicle):
    __tablename__ = "cars"
    doors: Mapped[int] = mapped_column()

class Truck(Vehicle):
    __tablename__ = "trucks"
    payload_tons: Mapped[float] = mapped_column()

Для полиморфных запросов через базовый класс нужен ConcreteBase или AbstractConcreteBase:

from sqlalchemy.orm import ConcreteBase

class Vehicle(ConcreteBase, Base):
    __abstract__ = True
    ...

Как выбрать стратегию

  • STI — иерархия неглубокая, различия минимальны, важна скорость SELECT.
  • JTI — разные наборы полей, нормализация важна, иерархия не более 2–3 уровней.
  • CTI — подклассы используются независимо, полиморфные запросы редки.

Подводные камни

  • STI + NOT NULL: колонки подклассов должны быть nullable, иначе INSERT для других подклассов упадёт.
  • JTI и polymorphic_load: по умолчанию SQLAlchemy загружает все подтаблицы одним JOIN — для больших иерархий используйте polymorphic_load="selectin".
  • CTI без ConcreteBase: select(Vehicle) не найдёт ни Car, ни Truck — нужен AbstractConcreteBase или ручной UNION.
  • Alembic и CTI: миграции сложнее, каждая таблица управляется отдельно.
  • with_polymorphic: без него запрос к базовому классу JTI не включает колонки подклассов — нужно явно указать with_polymorphic("*") или selectin_polymorphic.
  • Дискриминатор как строка vs Enum: строковый дискриминатор гибче, но без DB-ограничения можно случайно записать неизвестный тип.

Частые вопросы на собеседовании

  • Как решить проблему N+1 запросов в SQLAlchemy с помощью selectinload или joinedload?
  • Как работает Session в SQLAlchemy и что такое паттерн Unit of Work?
  • Как делать zero-downtime миграции с Alembic и SQLAlchemy models?
  • Что такое Engine в SQLAlchemy и как работает пул соединений?

Типичные ошибки

  • Описывать orm inheritance только как термин и не показывать механизм на минимальном примере.
  • Игнорировать ошибки, пустые данные, конкурентный доступ или границы транзакции.
  • Не связывать поведение с официальным контрактом SQLAlchemy и реальной эксплуатацией.

Что проверяет интервьюер

  • Объясняет orm inheritance через последовательность действий, а не через набор ключевых слов.
  • Приводит короткий кодовый пример или production-сценарий с ожидаемым поведением.
  • Называет хотя бы один риск: производительность, безопасность, транзакции, память или сопровождение.

Как вы знаете этот вопрос?

Проверить себя по теме SQLAlchemy →

Источники

  • https://docs.sqlalchemy.org/en/20/orm/inheritance.html

Связанные темы

SQLAlchemydatabase-designtechnical-reasoning

Вакансии с этим навыком

  • Python developer