Flask - SQL медленная алхимическая вставка из-за нескольких внешних ключей - PullRequest
0 голосов
/ 17 апреля 2020

Итак, в настоящее время я пытаюсь создать новое приложение, используя flask -restful для бэкэнда, и я все еще учусь, поскольку все это довольно ново для меня. Я уже настроил все с несколькими различными таблицами mySQL, подробно описанными далее, и со всеми взаимосвязями между ними, и все, кажется, работает нормально, за исключением того, что процесс вставки новых данных довольно медленный.

Вот (упрощенное) объяснение текущей настройки у меня есть. По сути, у меня прежде всего есть одна таблица «Полеты».

class FlightModel(db.Model):

    __tablename__ = "Flights"

    flightid = db.Column(db.Integer, primary_key = True, nullable=False)
    [Other properties]

    reviewid = db.Column(db.Integer, db.ForeignKey('Reviews.reviewid'), index = True, nullable = False)
    review = db.relationship("ReviewModel", back_populates="flight", lazy='joined')

Эта таблица затем указывает на таблицу «Обзоры», в которой я храню глобальный обзор, оставленный пользователем.

class ReviewModel(db.Model):

    __tablename__ = "Reviews"

    reviewid = db.Column(db.Integer, primary_key = True, nullable = False)
    [Other properties]

    depAirportReviewid = db.Column(db.Integer, db.ForeignKey('DepAirportReviews.reviewid'), index=True, nullable = False)
    arrAirportReviewid = db.Column(db.Integer, db.ForeignKey('ArrAirportReviews.reviewid'), index=True, nullable = False)
    airlineReviewid = db.Column(db.Integer, db.ForeignKey('AirlineReviews.reviewid'), index=True, nullable = False)

    flight = db.relationship("FlightModel", uselist=False, back_populates="review", lazy='joined')
    depAirportReview = db.relationship("DepAirportReviewModel", back_populates="review", lazy='joined')
    arrAirportReview = db.relationship("ArrAirportReviewModel", back_populates="review", lazy='joined')
    airlineReview = db.relationship("AirlineReviewModel", back_populates="review", lazy='joined')

Затем можно оставить более подробный обзор различных аспектов полетов, сохраненный в еще одной таблице (например, в следующей таблице DepAirportReviews: всего на этом уровне три таблицы).

class DepAirportReviewModel(db.Model):

    __tablename__ = "DepAirportReviews"

    reviewid = db.Column(db.Integer, primary_key = True, nullable = False)
    [Other properties]

    review = db.relationship("ReviewModel", uselist=False, back_populates="depAirportReview", lazy='joined')

Процесс вставки медленный (обычно для вставки требуется 1 секунда за полет, что является проблемой, когда я пытаюсь выполнить массовую вставку нескольких сотен из них).

Я понимаю, что это из-за всех этих взаимосвязей и это подразумевает все поездки в базу данных, чтобы получить разные идентификаторы для разных таблиц. Это правильно? Могу ли я что-нибудь сделать, чтобы решить эту проблему, или мне нужно будет изменить дизайн таблиц, чтобы удалить некоторые из этих связей?

Спасибо за любую помощь!

РЕДАКТИРОВАТЬ: отображение SQL выполнено прямо показал, что я ожидал: всего 7 простых запросов выполняются для каждой вставки, каждый занимает ~ 300 мс. Это довольно долго, я думаю, это в основном из-за времени, чтобы добраться до сервера. Ничего не поделаешь, кроме удаления некоторых внешних ключей, верно?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...