Удаление пользователей из команды в денормализованной структуре Firebase - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть некоторые базовые данные, структурированные таким образом.Это действительно просто, но я не могу понять, есть ли более простой способ структурировать его для эффективного добавления и удаления членов команды.

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

users:{
    user1:{
        name: "username",
        profilePicUrl: "https://...",
        teams:{
            team1:true
        }
    },
    user2:{
        ...
    } 
}
teams:{
    team1:{
        name:"SuperTeam",
        members:{
            user1: true,
            user2: true,
            ....
        }
    }
}

Я сделаю два запроса.Один просит всех членов команды, а другой - все команды члена.

В интерфейсе у меня есть множественный выбор, где пользователь может выбирать членов команды.Человек выберет / отменит выбор нескольких пользователей и нажмет кнопку сохранения.

Когда пользователь нажимает сохранить, происходит следующее:

  • Я удаляю всех участниковтаблицы команд и установите новые в зависимости от выбранных параметров.

  • Я добавляю команду выбранным пользователям с помощью команды «user /: userId / commands /: teamId» =>true

А как насчет удаления команды из таблицы пользователей? Я не могу найти эффективный способ сделать это.Предлагаемые мной решения следующие:

  • Обновление всех пользователей с помощью многократного обновления, устанавливающего для команд значение null или true в зависимости от выбора.Это могло бы работать для небольшого набора, но это не кажется очень эффективным для большого набора пользователей.
  • Удаление массива "groups" в таблице пользователей и получение команд каждого пользователя с помощьюзапрос "команды /: teamId / members / userX" равен true.Таким образом, мне нужно только обновить таблицу команд.Он работает, но должен загружать все данные команд, и для большой базы данных это не очень эффективно.

  • Ищите изменения в выбранных параметрах, когда нажата кнопка сохранения, и обновляйте толькопользователи, которые изменились (мой любимый до сих пор).

Есть ли другой способ структурировать базу данных?Есть ли другой способ легко удалить команду из участника?

1 Ответ

0 голосов
/ 11 декабря 2018

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

Вы должны были бы поставить ложь во многих из них и поставить истину в некоторых из них в соответствии с вашими требованиями.

Вы должны просто разместить информацию о команде только в узле teams, а другие важные сведения о пользователе в узле users.

Кроме того, если у самой команды естьname, затем присвоение ему имени team1 в структуре с указанием правильного имени, кажется излишним по сравнению с тем, что вы сказали в вопросе.

Итак, ваша структура базы данных должна выглядеть примерно так:

users:{
    user1:{
        name: "username",
        profilePicUrl: "https://...",
        otherInfo : ...
    },
    user2:{
        ...
    } 
}
teams:{
    SuperTeam{
         otherInfo: ...
         members:{
            user1: true,
            user2: true,
            ....
        }
    },

    MegaTeam {
         otherInfo: ...
         members:{
            user1: true,
            user2: true,
            ....
        }
    }

}

Теперь для удаления команды скажем, MegaTeam, вам просто нужно удалить один узел из узла teams,и информация об участниках также будет удалена, поэтому вам не придется запрашивать снова, чтобы удалить команды и другую информацию из узла users.

РЕДАКТИРОВАТЬ:

Поскольку вы используете Firebase, (noSQL) лучшее, что вы можете изменить базу данных и адаптировать ее под свои нужды.Поэтому я бы сказал, что лучшим способом было бы создать отдельную структуру для получения команд с пользователем.

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