Как эффективно выполнять поиск по вложенным данным пользователя? - PullRequest
0 голосов
/ 01 мая 2018

этот вопрос меня немного ошеломил, и я пришел сюда, чтобы посмотреть, раскрыл ли кто-нибудь этот случай, над которым я работаю.

Вот моя структура базы данных.

database
    posts
        userId
            postId
                title: "asd"
    postGeo
        g: "x"
        l:
            0: 'lat'
            1: 'long

Я использую, geoFire.queryAtLocation(userLocation, radius);, чтобы запросить каждый идентификатор сообщения в пределах указанной геозоны. Я храню каждый postId в диапазоне в своем собственном списке. Затем я использую этот список для получения информации о сообщении.

Мой вопрос, каков наиболее эффективный способ запроса или переорганизации моих данных, чтобы мне не приходилось перебирать КАЖДЫЙ пост?

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

database
    posts
        zipCode
            userId
                postId
                    title: "asd"
    postGeo
        g: "x"
        l:
            0: 'lat'
            1: 'long

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

Один из способов заключается в денормализации ваших данных и наличии двух структур данных параллельно в базе данных. Это довольно классический подход к базам данных NoSQL.

Так вы бы (как есть):

database
    posts
        userId
            postId
                title: "asd"

и вы добавите еще один узел, например:

database
    posts
        zipCode
            postId
                title: "asd"

Таким образом, вы можете эффективно запрашивать двумя разными способами.

Единственный недостаток этого метода заключается в том, что вам нужно синхронизировать два узла. Но это легко сделать, одновременно записывая данные в два узла базы данных, используя метод обновления, описанный здесь https://firebase.google.com/docs/database/web/read-and-write#update_specific_fields


Просто дополнительная заметка: вас может заинтересовать этот пост Загрузить существующее местоположение Geofire, если оно существует

0 голосов
/ 01 мая 2018

После того, как вы выполните гео-запрос, вы получите ключ для каждой записи, а затем вам нужно структурировать данные, чтобы вы могли просто извлечь эту запись, и вам не нужно будет искать или реорганизовывать данные.

Так что, если вы хотите, чтобы все postIds, ваши данные для сообщений будут

Database
   Posts
       PostId
          userId
               Title
...