Многие-ко-многим используют Firebase

Предположим, у меня есть два типа пользователей и учетных записей объектов. Пользователи могут иметь много учетных записей и делиться ими с другими пользователями. Таким образом AccountA может быть доступен для User1 и User2. Хотя AccountB доступен только для User1. Таким образом, User1 имеет две учетные записи, а User2 имеет одну учетную запись.

Каков способ "firebase" структурировать это?

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

users: {
  1: {
    name: 'Ted',
    accounts: [1, 2]
  }
  2: {
    name: 'Frank',
    accounts: [1]
  }
}

accounts: {
  1: {
    name: "Checking"
  },
  2: {
    name: "Savings"
  }
}

Или у учетной записи будет массив пользователей.

users: {
  1: {
    name: 'Ted'
  }
  2: {
    name: 'Frank'
  }
}

accounts: {
  1: {
    name: "Checking",
    users: [1, 2]
  },
  2: {
    name: "Savings"
    users: [1]
  }
}

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

Вопрос №1 Позаботились бы об этом правила безопасности? Под этим я подразумеваю, что планирую установить мое правило безопасности, чтобы пользователи могли использовать только те учетные записи, к которым они принадлежат. Я надеюсь, что если я запрошу "/accounts", я вернусь только к тем учетным записям, к которым пользователь может получить доступ... нет?

Вопрос №2 Есть ли механизм для запроса списка элементов. Как "/accounts/[1,2]", чтобы я возвращал учетные записи "/accounts/1" и "/accounts/2"?

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

Ответ 1

Прежде чем перейти к особенностям, вам нужно запомнить несколько вещей:

  • Обычно вы хотите структурировать свои данные на основе ваших шаблонов чтения. Поэтому, если вам нужно найти все учетные записи, в которых находится пользователь, вам нужно сохранить этот список где-нибудь. И если вы хотите найти всех пользователей, связанных с учетной записью, вам также необходимо сохранить этот список. Поэтому в вопросе №2 Firebase в настоящее время не имеет никакой общей возможности запросов (например, "/accounts [1,2]" ), хотя это, вероятно, произойдет в будущем.
  • Правила безопасности не могут использоваться для запроса данных. Вам либо разрешено читать все данные в определенном месте, либо ничего. Поэтому в отношении вашего вопроса № 1 правила безопасности не будут автоматически запрашивать/учетные записи для вас.
  • Правила безопасности не позволяют вам искать содержимое массива для элемента, но они могут проверять наличие ключа в объекте. Поэтому, если пользователи 1 и 4 имеют доступ к чему-то, вы, вероятно, захотите сохранить {1: true, 4: true}, а не [1, 4].

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

users: {
  1: {
    name: 'Ted',
    accounts: {
      1: true,
      2: true
    }
  }
  2: {
    name: 'Frank',
    accounts: {
      1: true
    }
  }
}

accounts: {
  1: {
    name: "Checking"
  },
  2: {
    name: "Savings"
  }
}

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

accounts: {
  1: {
    name: "Checking",
    users: {
      1: true,
      2: true
    }
  },
  2: {
    name: "Savings",
    users: {
      1: true
    }
  }
}

Надеюсь, это поможет!