SQLAlchemy ansioso para carregar vários relacionamentos

SQLAlchemy suporta uma carga ansiosa de relacionamento, é basicamente umJOIN declaração. No entanto, se um modelo tiver dois ou mais relacionamentos, pode ser uma junção muito grande. Por exemplo,

class Product(Base):
    __tablename__ = 'product'
    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String(255), nullable=False)
    orders = relationship('Order', backref='product', cascade='all')
    tags = relationship('Tag', secondary=product_tag_map)

class Order(Base):
    __tablename__ = 'order'
    id = Column(Integer, primary_key=True, autoincrement=True)
    date = Column(TIMESTAMP, default=datetime.now())

class Tag(Base):
    __tablename__ = 'tag'
    id = Column(Integer, primary_key=True, autoincrement=True)
    tag_type = Column(String(255), nullable=False)
    tag_value = Column(String(255), nullable=False)

q = session.query(Product).join(User.addresses)\
    .options(joinedload(Product.orders))\
    .options(joinedload(Product.tags)).all()

O desempenho desta consulta é muito ruim, porque oJOIN doOrder eTag irá gerar uma tabela enorme. Mas oOrder eTag não tem relacionamento aqui, então eles não devem serJOIN. Deve haver duas consultas separadas. E como a sessão tem algum nível de armazenamento em cache, mudei minha consulta para isso.

session.query(Product).join(Product.order) \
    .options(joinedload(Product.tags)).all()

q = session.query(Product).join(User.addresses) \
    .options(joinedload(Product.cases)).all()

Desta vez, o desempenho é muito melhor. No entanto, não estou convencido de que isso seja correto. Não tenho certeza se os caches de tags expirarão quando a sessão terminar.

Informe-me da maneira apropriada para esse tipo de consulta. Obrigado!

questionAnswers(1)

yourAnswerToTheQuestion