如果我有一个包含一百万个项目的主列表,另一个包含一百万个用户的列表,并且每个用户都有一个包含50个项目的自定义排序子集,那么建模的直接方式就是:
items
[itemID] : { name : 'aaa', description : 'bbb', ... }
...
users
[userID1] : {
name : 'john',
token : 'xyz',
sortedItems : {
itemID1 : xx,
itemID2 : xx,
...
}
}
每个用户都可以按需要的顺序获取自己的sortedItems集合。这样做的问题是每个项目必须有多个请求才能获得完整的项目数据。处理完排序列表的更新后,您需要查询主列表以获取项目数据。没什么大不了的,但这是推荐的吗?
另一种策略是在主列表和子列表中复制项目数据(或删除主列表)。这样,当您需要时,所有数据都在那里。明显的问题是同步。如果项目的属性发生变化会发生什么?您必须循环遍历每个用户的sortedItems列表并更新每个实例 - 严重数据不一致的配方。
思想?
答案 0 :(得分:2)
这是推荐的方法。非标准化在可伸缩系统中非常常见,并且应该适用于您的用例。
我建议只复制密钥,而不是数据。这样您就不会遇到同步问题,并且每个人都将共享一个主状态。在加载每个项目时,您将需要额外的往返,但请注意Firebase在处理大量回调和缓存更新方面非常聪明,因此我怀疑您会发现它仍然非常快。