2017-08-14 76 views
1

字符串我正在用这样的数据库结构的应用:更新在多个地点的火力

{ 
    "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这么所有用户的帖子呢?我必须先下载所有数据并更新它,或者有其他方法?

我认为在用户输入帖子时只使用位置ID来获取每个位置的位置名称并不是一个好主意。

+0

你应该看看这个https://www.youtube.com/watch?v=WacqhiI-g_o&list=PLl-K7zZEsYLlP-k-RKFa7RyNPa9_wCH2s它会让一切变得清晰 – cutiko

回答

0

您可以添加更多的属性LOCATION1,说isLocationOf,这将存储所有用户ID或许帖子ID /后的名称。 Like

"Locations": { 
    "location1": { 
    "name": "Nice location", 
    "isLocationOf": { 
       'post1': true, 
       'post2': true 
        } 
    } 
} 

这里isLocationOf是Locations的属性,它的值是一个对象。
现在,如果locations1的名称被更改,那么您可以检索其isLocationOf对象,遍历它,获取包含该位置的所有帖子ID /名称。然后使用帖子ID更新具有此地址的所有条目。
             此外,每当你添加新的岗位,你要的帖子ID /名称添加到isLocation对象。

1

通过复制数据,以降低写入性能为代价提高了读取性能/可伸缩性。这是NoSQL数据库和一般高度可扩展系统中的正常平衡。

如果你想更新所有帖子的location_name,你将不得不查询帖子并更新每个帖子。如果您需要定期执行此操作,请考虑为每个位置保留一个单独的查找列表以查找其使用的帖子。这种倒排索引是NoSQL数据库中的另一种常见现象。

我介绍的策略在我的答案在这里更新复制数据:How to write denormalized data in Firebase

从关系/ SQL背景的人,这可能会开始觉得不舒服,因为它违背了我们一直被教导的规范化规则。为了对付这种感觉,我推荐阅读NoSQL data modeling,看Firebase for SQL developers,一般只是多看一些NoSQL data modeling questions