Медленный доступ к БД (FastAPI Firebase)

#python #firebase-realtime-database #fastapi #pyrebase

#python #firebase-база данных в реальном времени #fastapi #pyrebase

Вопрос:

Я пытаюсь создать серверную службу (FastAPI), которая подключена к Firebase, используя вспомогательную библиотеку Pyrebase (как предложено в документации Firebase). База данных Firebase в реальном времени имеет структуру:

 "myproject_db" : {
        "movies":
            "key1": {
                "movie_id": 33
                "other_id": 44
            },
        "ratings":
            "key1": {
                "user_id" : 1
                "rating" : 5
                "movie_id" : 33
            },
    }
 

База данных фильмов и рейтингов содержит более 10 000 полей.

Теперь мой метод / getRatedMovies для конкретного пользователя описан ниже. Несмотря на то, что это работает, для завершения требуется более 30 секунд. Основная причина — повторение фильмов. Кажется, что каждый раз, когда мне нужно найти конкретный фильм, мне нужно просмотреть всю таблицу. Есть ли альтернативное решение, которого мне не хватает? Спасибо.

 @app.get("/getRatedMovies")
async def ratedMovies():
    try:
        ratings = db.child("ratings").order_by_child("user_id").equal_to(username).get()

        restructuredMovies: List[Movie] = []
        for rating in ratings.each():
            movieid: int = rating.val()["movie_id"]
            movies = db.child("movies").order_by_child("movie_id").equal_to(movie_id).get()
            for movie in movies:
                movieid: int = movie.val()['movie_id']
                other_id: Optional[str] = movie.val()["other_id"]
                restructuredMovie: Movie = Movie(title = movie.val()["title"], movieid = movieid, other_id = other_id)
                restructuredMovies.append(restructuredMovie)
        return {"Movies": restructuredMovies}
    except Exception as error:
        return {"error": "Something went wrong."}
 

Комментарии:

1. Мое первоначальное предположение заключается в том, что вы запускаете много запросов REST, что просто займет время. Итак: 1) Сколько существует оценок? 2) Насколько велик каждый фильм? 3) Любые дополнительные сведения о том, куда уходит время в коде, которым вы поделились, были бы полезны.

2. Если вы пытаетесь получить все фильмы, которые были оценены, добавьте поле для каждого фильма, которое указывает, что фильм был оценен. Добавьте индекс в это поле в Firebase, чтобы вы могли просматривать фильмы через это поле. Добавьте правильное ограничение для разбивки на страницы, чтобы не извлекать всю таблицу (как только количество фильмов с рейтингом увеличится, оно начнет приближаться к полной таблице каждый раз).

3. Индекс уже есть как в фильмах, так и в рейтингах. Я предполагаю, что он восстанавливает все записи, а затем я пытаюсь выполнить поиск. Как предположил Матс, возможно, я могу разбить записи на страницы и выполнить поиск в пакетах. Время будет варьироваться в зависимости от того, какой пакет я нахожу. Могу ли я получить доступ к счетчику, чтобы я мог соответствующим образом разделить пакеты?