2013-07-02 7 views
12

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

Что такое способ «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] 
    } 
} 

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

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

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

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

ответ

20

Прежде чем перейти к конкретике, есть несколько вещей, которые вы хотите иметь в виду:

  1. Вы обычно хотите структурировать данные, основанные на вашей модели чтения. Поэтому, если вам нужно найти все учетные записи, в которых находится пользователь, вам нужно сохранить этот список где-нибудь. И если вы хотите найти всех пользователей, связанных с учетной записью, вам также необходимо сохранить этот список. Поэтому в вопросе №2 Firebase в настоящее время не имеет никакой общей возможности запросов (например, «/ accounts [1,2]»), хотя это, вероятно, произойдет в будущем.
  2. Правила безопасности не могут использоваться для запроса данных. Вам либо разрешено читать все данные в определенном месте, либо ничего. Поэтому в отношении вашего вопроса № 1 правила безопасности не будут автоматически запрашивать/учетные записи для вас.
  3. Правила безопасности не позволяют вам искать содержимое массива для элемента, но они могут проверять наличие ключа в объекте. Поэтому, если пользователи 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 
    } 
    } 
} 

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

+3

Не могли бы вы указать, как бы вы сделали запрос. Если и только у вас есть ссылка на firebase для конкретного пользователя. Как вы получите информацию об учетной записи – feresr

+2

@feresr, вам понадобится несколько запросов - первое, чтобы получить список учетных записей (/ users/1/accounts), а затем по одному для каждой интересующей вас учетной записи (в/accounts/п). Вот почему иногда стоит хранить некоторую итоговую информацию в разделе/​​users/x/accounts/y, например, псевдоним учетной записи. –

+0

Хорошо. Теперь я имею в виду. Благодаря! – feresr

Смежные вопросы