Что такое модель данных в ORM?

«Что такое модель данных в ORM?» — вопрос из категории Моделирование данных и DWH, который задают на 33% собеседований Data Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Модель данных в ORM (Object-Relational Mapping) — это класс в коде приложения, который является отображением таблицы (или представления) реляционной базы данных. Каждый экземпляр такого класса представляет собой строку в таблице, а его атрибуты — колонки. ORM-фреймворк берет на себя преобразование объектов в SQL-операции (CRUD) и обратно.

Основная цель: Абстрагировать разработчика от написания сырого SQL для базовых операций, позволяя работать с данными как с родными объектами языка программирования.

Пример модели на SQLAlchemy (Python) для DWH-слоя:

from sqlalchemy import Column, Integer, String, Date, ForeignKey
from sqlalchemy.orm import relationship
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

# Модель измерения (Dimension)
class DimCustomer(Base):
    __tablename__ = 'dim_customer'
    customer_key = Column(Integer, primary_key=True)  # Суррогатный ключ
    customer_id = Column(String, unique=True, nullable=False)  # Бизнес-ключ
    full_name = Column(String)
    region = Column(String)
    valid_from = Column(Date)
    valid_to = Column(Date)
    is_current = Column(Integer, default=1)
    # Связь с фактовой таблицей
    sales = relationship('FactSales', back_populates='customer')

# Модель фактовой таблицы (Fact)
class FactSales(Base):
    __tablename__ = 'fact_sales'
    sales_key = Column(Integer, primary_key=True)
    customer_key = Column(Integer, ForeignKey('dim_customer.customer_key')) # Ссылка на измерение
    product_key = Column(Integer, ForeignKey('dim_product.product_key'))
    date_key = Column(Integer, ForeignKey('dim_date.date_key'))
    amount = Column(Integer)
    quantity = Column(Integer)
    # Определение отношений
    customer = relationship('DimCustomer', back_populates='sales')
    product = relationship('DimProduct')
    date = relationship('DimDate')

Ключевые преимущества и особенности в контексте DWH:

  • Согласованность: Единая точка определения структуры таблиц, их связей и ограничений.
  • Безопасность типов: Работа с типизированными объектами вместо строковых SQL-запросов снижает риск ошибок.
  • Миграции: Многие ORM (например, через Alembic для SQLAlchemy) позволяют генерировать и применять скрипты миграции схемы БД на основе изменений в моделях.
  • Производительность: Требует внимания к генерации SQL (проблема N+1 запроса) и часто используется в ETL-процессах для загрузки данных, а не для сложных аналитических запросов, где предпочтительнее чистый SQL или специализированные OLAP-движки.