Самый быстрый способ получить группу пользователей (для миллионов строк) - PullRequest
2 голосов
/ 05 марта 2019

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

- usersGroups
    - group1
        - user1: true
        - user2: true
        - user3: true

- users
    - user1
        - name: 'Bob'
        - group: group1
    - user2
        - name: 'Carl'
        - group: group2
    - user3
        - name: 'Peter'
        - group: group3

Чтобы определить имена пользователей, принадлежащих к group1, я сейчас выполняю этот запрос:

const groupUserSnap = firebase.database().ref('usersGroups/group1').once('value');

let userPromises = [];
groupUserSnap.forEach((snap) => {
    userPromises.push(
        firebase.database().ref(`users/${snap.key}`).once('value')
    );
});

// Wait until we have resolved promises for each user key
const userSnaps = await Promise.all(userPromises);

userSnaps.forEach((userSnap) => {
    const user = userSnap.val();
    console.log(`User's name is ${user.name}`);
});

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

Недавно мы добавили ключ group также к каждому пользователю (как показано на приведенной выше структуре), чтобы мы могли легко идентифицировать группу, к которой принадлежит пользователь, без необходимости запрашивать userGroups.

Теперь, когда ключ group присутствует в user, мы можем вместо этого выполнить этот запрос для получения пользователей, принадлежащих к группе:

firebase.database().ref('users').orderByChild('group').equalTo('group1').once('child_added');

У меня вопрос: делает ли этот запрос данные usersGroups избыточными или я должен продолжать получать пользователей групп, как я это делал в предыдущем примере, для целей скорости?

1 Ответ

1 голос
/ 05 марта 2019

Я считаю, что было бы лучше структурировать данные следующим образом:

- users
    - user1
        - name: 'Bob'
        - group: 1
    - user2
        - name: 'Carl'
        - group: 2
    - user3
        - name: 'Peter'
        - group: 3

Не забудьте обновить правила базы данных Firebase до следующего вида:

"users": {
      ".indexOn": ["group"]
    }

Тогда вы сможете фильтровать / сортировать данные следующим образом:

let groupNum = 1  // the group's number being filtered
firebase.database().ref('users')
.orderByChild('group')
.equalTo(groupNum)
.once('value', (snapshot) => {
  let filteredUsers = []
  snapshot.forEach((user) => {
    filteredUsers.push({
      _key: user.key,
      ...user.val() //this will add all the user's value
    })
  })
  console.log(filteredUsers) // will show [{_key: 'user1', name: 'Bob', group: 1}]
})

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

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