Как можно защитить структуру, если входные данные представляют собой объект json, состоящий из нескольких объектов json с непредопределенными уникальными ключами на родительский узел (например, на пользователя)?
То же самое вопрос с примером:
- Любой пользователь может иметь любимую еду.
- Подробная информация о еде не важна, так как эта информация поступает откуда-то еще.
- Пользователь может иметь больше -1 и меньше 1001 количества любимых продуктов.
- Синхронизировать нужно только измененные данные, чтобы минимизировать затраты Firebase.
Итак, если пользователь отметил 3 продукты с id E5435, 59z195J, k311 в качестве избранных: следующая структура кажется в порядке.
{ fav: { $uid { "E5435":1, "59z195J":1, "k311":1 } } }
Но! Как можно предотвратить расширение структуры с произвольными данными? Вы можете добавить правила проверки для проверки типа и длины данных и т. Д. c .. но дочерние имена не определены и могут быть чем-то похожим на приведенный выше пример.
Я не хочу сохранять 1 длинную строку избранного, поскольку это означает syn c не будет работать частично, и я должен перезаписывать данные и загружать каждый раз.
Я не могу добавить все возможные идентификаторы еды, так как это сделает структуру очень длинной и этот список может увеличиться в любое время.
Как можно добавить правило для защиты этой структуры, когда возможный ввод выглядит примерно так:
/fav/UID1234567/ <-- {"AAAA5":1,"G545345":1,"D454WW":1}
( Примечания: Идентификаторы продуктов питания намеренно написаны со смешанными символов. Если это облегчает анализ вопроса, их можно заменить именами.
AAAA5 --> APPLE, D454WW --> RICE )
, формируя: /fav/UID1234567/ <-- {"APPLE":1,"RICE":1}
И имейте в виду, что не может быть заранее заданного списка продуктов на выбор: Итак, ничего вроде [BANANA, APPLE, RICE, SUSHI,.....]
не существует. Этот ОГРОМНЫЙ список существует, но за пределами Firebase.
Когда клиент полностью загружает содержимое /fav/USERID/
(o только один раз), он сравнивает весь список с каким-либо другим списком, чтобы отфильтровать эти элементы и показать их как избранные.
Конец заметок )
Дополнительная информация: Для ясности, как бы вы запретили использование какого-либо длинного текста вместо «APPLE» и снова длинного текста вместо значения «1». Поскольку эти данные увеличат стоимость базы и могут рассматриваться как атаки. Обычные правила проверки, похоже, не работают, так как в этом примере мы не выдвигаем значения 1 на 1, а их несколько. Итак, нет newData().children().key.isString()
и newData().children().key.length()
, et c ...