2017-01-17 1 views
0

Так, скажем, у меня есть данные, как это:Как структурировать данные в Firebase, созданные одним пользователем, но доступные пользователям в группе?

{ 
    "events" : { 
    "s0d980983s" : 
    { creator: "[email protected]", 
     text: "Bob says 'My name is Robert'" }, 
    "kjl34jl234j" : 
    { creator: "[email protected]", 
     text: "Fred says 'My name is Fredrick'" } 
    } 
    "users" : { 
    "[email protected]" : { "paid": true }, 
    "[email protected]" : { "paid": false } 
    } 
} 

Я предполагаю, что это правильный способ структурирования данных. Когда данные создаются, я использую метод push() для создания нового ключа для данных, а затем сохраняю создателя данных внутри него.

Я хотел бы сделать это так, чтобы:

  • я могу позволить любому из группы пользователей для доступа к определенным данным (и запретить другим, очевидно).
  • Запрос «оптимизирован», то есть если у меня есть тысячи записей, я не перебираю все данные.

Более конкретно, например, я хочу [email protected], чтобы увидеть s0d980983s.

Я смущен, как структурировать данные и как должны выглядеть мои правила Firebase.

Будет ли это примерно так?

{ "events" : { 
    "s0d980983s" : 
    { creator: "[email protected]", 
     viewers: { "[email protected]": true, 
       "[email protected]" : true }, 
     text: "Bob says 'My name is Robert'" }, 
... 
} 

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

var ref = firebase.database().ref("events/*/viewers/[email protected]").on(...); 

Должен ли я также ссылаться на события внутри таблицы моих пользователей? Я не уверен, что я понимаю, как сгладить данные (денормализовать его) и сохранить ссылки в обоих местах для поддержки такого запроса. Должен ли я ожидать несколько запросов, когда я сначала получаю список событий, хранящихся в объекте пользователя, а затем извлекаю их один за другим с помощью их ключа? Но, как я вставляю эту логику в свои правила firebase?

+1

Вы можете использовать подстановочные знаки при написании правил безопасности. Это видео может быть полезно https://www.youtube.com/watch?v=PUBnlbjZFAI –

ответ

0
{ "events" : { 
     "s0d980983s" : 
     { creator: "[email protected]", 
     viewers: { "[insert bobs id]": true, 
        "[insert liz id]" : true 
       }, 
     text: "Bob says 'My name is Robert'" }, 
     ... 
} 

Основываясь на приведенной выше структуре, как Вы предложили, и если вы используете firebase аутентификации для аутентификации пользователя, вы можете добавить еще один «читать» или «запись» правила для проверки того, что пользователь находится в списке ваших «зрителей». что-то вроде:

{ 
    "rules": { 
    "users": { 
     "$uid": { 
     ".write": "auth != null && 
      root.child('users').child(auth.uid).child('viewers').child(auth.uid).val() == 
      true" 
     } 
    } 
    } 
} 

Это должно помочь. setting firebase security rules at a location/node

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