#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. Индекс уже есть как в фильмах, так и в рейтингах. Я предполагаю, что он восстанавливает все записи, а затем я пытаюсь выполнить поиск. Как предположил Матс, возможно, я могу разбить записи на страницы и выполнить поиск в пакетах. Время будет варьироваться в зависимости от того, какой пакет я нахожу. Могу ли я получить доступ к счетчику, чтобы я мог соответствующим образом разделить пакеты?