У меня есть отношения базы данных с многие-ко-многим ассоциации, но сама таблица ассоциации содержит много атрибутов, которые должны быть доступны, так что я сделал три класса:SQLAlchemy Многие-ко-многим производительности
class User(Base):
id = Column(Integer, primary_key=True)
attempts = relationship("UserAttempt", backref="user", lazy="subquery")
class Challenge(Base):
id = Column(Integer, primary_key=True)
attempts = relationship("UserAttempt", backref="challenge", lazy='subquery')
class UserAttempt(Base):
challenge_id = Column(Integer, ForeignKey('challenge.id'), primary_key=True)
user_id = Column(Integer, ForeignKey('user.id'), primary_key=True)
Это, конечно, упрощенный случай, когда я оставил другие атрибуты, которые мне нужны для доступа. Цель здесь состоит в том, что каждый User
может попытаться выполнить любое количество Challenge
s, следовательно, таблицу UserAttempt
, в которой описывается один конкретный пользователь, работающий с одной задачей.
Проблема теперь: когда я запрашиваю для всех пользователей, а затем смотрю на каждую попытку, я в порядке. Но когда я смотрю на вызов этой попытки, он взрывается в многочисленных подзапросах. Конечно, это плохо для производительности.
То, что я на самом деле хочу от SQLAlchemy, состоит в том, чтобы вытащить все (или все релевантные) вызовы сразу, а затем связать его с соответствующими попытками. Это не имеет большого значения, если все проблемы вытащить или только сделать, которые имеют фактическую ассоциацию позже, так как это количество проблем составляет только между 100-500.
Мое решение прямо сейчас на самом деле не очень элегантно: я тяну все соответствующие попытки, проблемы и пользователей отдельно, а затем ассоциировать вручную: Петля через все попытки и назначить добавить пользователю вызов &, затем добавить пользователя вызов & в попытка тоже. Это кажется мне жестоким решением, которое не должно быть необходимым.
Однако каждый подход (например, изменение «ленивых» параметров, измененных запросов и т. Д.) Приводит к запросам от сотен до тысяч. Я также пытался писать простые SQL
запросы, которые дали бы мои желаемых результатов и придумали что-то вдоль линий SELECT * FROM challenge WHERE id IN (SELECT challenge_id FROM attempts)
и работали хорошо, но я не могу получить его перевод на SQLAlchemy
Большое спасибо заранее любые рекомендации, которые вы можете предложить.