【发布时间】:2016-10-06 00:47:18
【问题描述】:
我需要帮助找出在我的用例中使用 firebase 的最佳方式。我正在制作 Twitter 克隆,但与 FireFeed 不同的是,我的帖子是可变的。
我的数据库结构如下:
房间,本质上是您可以订阅的帖子的提要。房间的成员可以向该房间写帖子:
- rooms/{roomId}/posts/{postId}/ -> 包含标题、cmets 数量、喜欢等属性的帖子摘要
- rooms/{roomId}/users/{userId}/ -> 订阅此房间的所有用户列表
- rooms/{roomId}/info/ -> 房间大小、类型、名称等
用户,所有用户的全局列表:
- users/{userId}/feed/{postId} -> 来自用户订阅的所有房间的所有房间/{roomId}/posts/ 的聚合
- users/{userId}/rooms/{roomId} -> 用户订阅的所有房间列表
帖子,实际帖子内容的全局列表:
- posts/{postId}/cmets/{commentId} -> 嵌套 cmets
- posts/{postId}/users/{userId} -> 想要在此帖子上推送通知的用户
- posts/{postId}/info/ -> cmets 数量、点赞数、作者、发布日期等
- posts/{postId}/content/ -> 实际内容
学校、房间列表:
- schools/{schoolId}/rooms/{roomName}/info -> 学校房间列表。房间名称在学校内是唯一的
- schools/{schoolId}/admins/{userId} -> 具有不同授权规则的管理员列表
现在,前两个用例很好。困惑来自于如何制作和编辑对帖子的引用。我的用例是:
用例 0:用户想要创建一个房间。
- 多位置将房间对象更新到 /rooms/,并将适当的房间摘要对象更新到学校/{schoolId}/rooms/ 和 users/{userId}/rooms/。
用例 1:用户想要订阅一个房间。
- 在房间/{roomId}/ 上运行事务。将 {userId} 添加到 rooms/{roomId}/users/ 并将房间大小增加 1。
- 事务完成后,拍摄快照并进行多位置更新。将房间/{roomId}/posts 复制到 users/{userId}/feed,将 {roomId} 添加到 user/{userId}/rooms/ 并将新大小写入 /schools/{schoolId}/rooms/{roomName}/info .
- 如果多写失败,则从房间/{roomId}/users/ 中删除 {userId}。
用例 2:用户想要在房间里发帖。
- 从房间/{roomId}/users 中检索用户列表
- 使用帖子摘要和帖子对象在多位置更新所有用户提要和全局帖子表。
这样的问题是,如果另一个用户在我们的用户检索用户列表后立即加入这个房间,那么他就不是接收这个新帖子的多地点更新的一部分。
当我尝试更新帖子中的 cmets 数量时,我面临着类似的难题。如果一个帖子有 15 个 cmets,并且有 2 个人同时对该帖子添加新评论,则全局帖子对象在事务完成时将正确更新为 17,但根据之后扇出的顺序,每个人的帖子摘要对象可能有 16 cmets。当用户加入房间时,房间的大小也是如此。
我应该怎么做?有没有办法更好地为我的数据建模,或者有没有办法在事务期间正确地进行多位置更新?
【问题讨论】:
-
没有 API 可以进行多位置更新,该更新采用它更新的(某些)节点的当前值。常见的选项是:1)在树中运行足够高的事务(这限制了并发性),2)更改数据结构以将共享数据向下推送到树中,3)使用受信任的进程(例如小节点。 js 服务器)来运行事务中的逻辑。
-
还可以在这里查看我的(稍微相关的)答案:stackoverflow.com/questions/30693785/…
-
@FrankvanPuffelen 你能详细说明一下2吗?如何更改数据结构?
标签: firebase firebase-realtime-database