我正在创建一个具有以下数据库结构的应用程序:
{
"Locations": {
"location1": {
"name": "Nice location"
}
},
"User_posts": {
"user1": {
"post1": {
"location_name": "Nice location",
"location_id": "location1",
"description": "Wow!"
},
"post2": {
"location_name": "Nice location",
"location_id": "location1",
"description": "Nice"
}
}
}
如果我必须更改location1名称,如何更改所有用户帖子的所有location_name?我必须先下载所有数据并更新它或有其他方法吗?
我认为在用户输入帖子时,仅使用location id获取每个位置的位置名称并不是一个好主意。
答案 0 :(得分:1)
通过复制数据,您可以降低写入性能,从而提高读取性能/可伸缩性。这是NoSQL数据库和一般高度可扩展系统中的正常权衡。
如果您要更新所有帖子的location_name
,您确实需要查询帖子并更新每个帖子。如果您需要定期执行此操作,请考虑为每个位置保留单独的查找列表,以查找其使用的帖子。这种反向索引是NoSQL数据库中另一种常见现象。
我在答案中介绍了更新重复数据的策略:How to write denormalized data in Firebase
来自关系/ SQL背景,这可能最初感到不舒服,因为它违背了我们已经教过的规范化规则。为了抵制这种感觉,我建议您阅读NoSQL data modeling,观看Firebase for SQL developers,一般只需阅读NoSQL data modeling questions。
答案 1 :(得分:0)
您可以向location1添加一个属性,例如isLocationOf,它将存储所有用户ID 或者帖子ID /帖子名称。喜欢
react-native-router-flux -version
这里isLocationOf是Locations的一个属性,其值是一个对象。
现在如果locations1的名称被更改,那么你可以检索它的isLocationOf对象,遍历它,获取包含该位置的所有帖子id / name。然后使用post id更新所有具有此地址的条目
此外,无论何时添加新帖子,都必须将其帖子ID /名称添加到isLocation对象。