База данных Firebase Realtime не имеет ссылок между свойствами. Это означает, что, хотя вы, как разработчик или пользователь, можете видеть, что каждый элемент в коллекции должен соответствовать элементу в каталоге, Firebase не имеет встроенного способа обеспечить это отношение.
Что вы можете сделать, это добавить правила проверки, обеспечивающие существование элементов в пользовательской коллекции. Скажем, например, что вы храните каталог и пользовательские коллекции следующим образом:
catalogue: {
item1: { name: "Cookies" },
item2: { name: "Cookies" },
item3: { name: "Cookies" }
},
collections: {
user1: {
item1: true,
item2: true
},
user2: {
item2: true,
item3: true
}
}
Вы можете использовать следующие правила безопасности, чтобы гарантировать, что каждый /collections/$uid/$itemId
также должен существовать в /catalogue
:
{
"rules": {
"collections": {
"$uid": {
"$itemId": {
".validate": "root.child('catalogue').child($itemId).exists()"
}
}
}
}
}
Это означает, что вы можете удалить элемент из каталога, только если в пользовательских коллекциях больше нет ссылок на этот элемент. Таким образом, для приведенных выше примеров данных эта запись завершится неудачно (поскольку два пользователя имеют элемент в своей коллекции):
firebase.database().ref("catalogue").child("item2").remove()
Но если мы последовательно запустим следующий код, он будет работать:
firebase.database().ref("collections/user1/item2").remove().then(function() {
firebase.database().ref("collections/user2/item2").remove().then(function() {
firebase.database().ref("catalogue").child("item2").remove()
})
})
Это вложение кода довольно неудобно, и обновления не являются атомарными. Вот почему вы часто будете видеть такие «каскадные удаления», выполняемые с помощью одного обновления нескольких местоположений:
firebase.database().ref().update({
"collections/user1/item2": null,
"collections/user2/item2": null,
"catalogue/item2": null
})
Этот единственный оператор обновляет три свойства в базе данных и подтверждает, что результат всех трех обновлений в сочетании действителен в соответствии с правилами (что в данном случае и так).