1

如果我有一个包含一百万个项目的主列表,另一个包含一百万个用户的列表,并且每个用户都有一个包含 50 个项目的自定义排序子集,那么建模的直接方法是:

items
    [itemID] : { name : 'aaa', description : 'bbb', ... }
    ...

users
    [userID1] : {  
        name : 'john', 
        token : 'xyz',
        sortedItems : {
            itemID1 : xx,
            itemID2 : xx,
            ...
        } 
    }

每个用户都会以任何需要的顺序获得他们自己的 sortedItems 集合。这样做的问题是您必须对每个项目有多个请求才能获取完整的项目数据。处理排序列表的更新后,您需要查询主列表以获取项目数据。没什么大不了的,但这是推荐的吗?

另一种策略是在主列表和子列表中复制项目数据(或删除主列表)。这样,当您需要时,所有数据就在那里。明显的问题是同步。如果项目的属性发生变化会发生什么?您必须遍历每个用户的 sortedItems 列表并更新每个实例——这是导致严重数据不一致的原因。

想法?

4

1 回答 1

2

这是推荐的方法。反规范化在可扩展系统中非常常见,应该适用于您的用例。

我建议只复制密钥,而不是数据。这样你就没有同步问题,每个人都将共享一个主状态。加载每个项目时会产生额外的往返,但请注意 Firebase 在处理大量回调和缓存更新方面非常聪明,所以我怀疑你会发现它仍然相当快。

于 2013-04-08T23:43:04.953 回答