Как влияют на производительность правила чтения/записи/проверки Firebase?

Я читал документацию Firebase о правилах безопасности и чтения/записи/проверки. Документация довольно подробная, но я не могу найти никакой информации о влиянии правил безопасности на производительность (запросы, извлечение, запись данных и т. д.).

Например, рассмотрим приведенный ниже пример базы данных:

myapp : {
    projects : { 
        <project_id> : { ... }
    }
    users    : { 
        <uid> : { role : <admin or pm or other> }
    }
}

.. и следующие правила базы данных для чтения:

rules : {
   projects : {
       $project : {
             {
              .read: root.child(‘users’).child(auth.uid) && root.child(‘users’).child(auth.uid).child(‘role’).val() == “admin” || root.child(‘users’).child(auth.uid).child(‘role’).val() == “pm”
                  } 
               }  
            }

Когда дело доходит до чтения данных из любого узла $project (например: .child("projects/alpha).once()), какое влияние это правило окажет на производительность по сравнению с тем, если бы НЕ существовало правила чтения? Если я выполняю несколько запросов/ читает одно за другим, будет ли правило оцениваться каждый раз, или Firebase «сохраняет» результат правила где-то, чтобы избежать повторной оценки?


person Cathryn Griffiths    schedule 10.01.2017    source источник


Ответы (1)


Правила чтения и записи Firebase оцениваются в том месте, где вы записываете данные или где вы подключаете прослушиватель. В примере, которым вы поделились, у вас либо есть разрешение на чтение для всех имен проектов, либо у вас нет разрешения (поскольку правила нельзя использовать для фильтрации данных). Таким образом, правило не нужно оценивать для каждой операции чтения, а только при подключении прослушивателя (или при изменении состояния аутентификации).

Учитывая декларативный характер правил безопасности Firebase, я сомневаюсь, что ответы на эти вопросы повлияют на написанные вами правила. По этой причине они были специально разработаны как декларативные: реализация на стороне сервера может меняться без изменения языка правил.

Вы должны написать правила, определяющие, что вам нужно, а затем предоставить серверу базы данных Firebase решить, как их эффективно выполнять. Если вы когда-нибудь столкнетесь со случаем, когда, по вашему мнению, ваши правила замедляют чтение или запись, я бы хотел увидеть это в вопросе.

person Frank van Puffelen    schedule 10.01.2017
comment
Привет, Фрэнк, спасибо за быстрый ответ. В качестве дополнения, какое влияние на производительность оказывает наличие правила или его отсутствие? Это по существу ничтожно? (Я внес некоторые изменения в вопрос, чтобы быть более понятным). - person Cathryn Griffiths; 10.01.2017
comment
Если у вас нет проблем с производительностью, которые, по вашему мнению, вызваны конкретными правилами, я бы придерживался написания правил, соответствующих вашему варианту использования. Все остальное — преждевременная оптимизация. - person Frank van Puffelen; 10.01.2017