В Firebase, как обновить дочерний элемент всех узлов с предыдущего уровня?

#javascript #firebase #firebase-realtime-database #nosql

#javascript #firebase #firebase-realtime-database #nosql

Вопрос:

Я впервые структурирую данные в базе данных firebase.

Я понял, что я должен оптимизировать операции чтения и денормализовать.

У меня есть список проектов и список пользователей. Кроме того, у каждого пользователя есть список проектов, связанных с ним.

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

Имея ключ этого проекта, я могу обновить его с помощью projects/key/name , но я также должен обновить имя в проектах, связанных с каждым пользователем. Я пробовал использовать users/*/key , но ничего не произошло.

Я использую firebase с javascript в базовом веб-приложении.

введите описание изображения здесь

Изначально у меня было true значение для всех проектов внутри users узла (вместо имени). При таком подходе мне просто нужно обновить в projects узле, но я должен выполнить несколько операций чтения.

Заранее благодарю.

Ответ №1:

Для этого вам понадобятся два индекса:

  1. чтобы найти проекты для пользователя (у вас уже есть это)

  2. чтобы найти пользователей для проекта

Я бы сохранил два списка поиска как списки верхнего уровня:

 users
  $uid
    admin: true
projects
  $projectid
    name: "Name of project"
    description: "Description of project"
userProjects
  $uid
    $projectid: "Name of project"
projectUsers
  $projectid
    $uid: true
  

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

Когда вы обновляете название проекта, вы просто загружаете пользователей проекта, а затем повторяете это. Если вам захочется, вы даже можете использовать многопозиционный update() , чтобы обновить их все за один раз. Подробнее об этом читайте в этом сообщении в блоге:https://firebase.googleblog.com/2015/10/client-side-fan-out-for-data-consistency_73.html