Ответ
Модель данных в 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-движки.